我正在使用的程序使用OpenStreetMap数据来渲染地图。数据由4个坐标组成,这些坐标构成数据的边界。
我画线,有时超过这些界限 - 我想让线条在边界的确切点停止,当一条线由一个点内部和一个点组成时。并且在界外发生。因为我知道边界的点,以及边界内外的点 - 我可以计算这两条线之间的交点,但不准确性非常不一致。在里面 first picture attached,你可以看到,路口在哪里。在second picture attached上,您可以看到交叉点之间的位置 - 这是我遇到过的最糟糕的情况。
这些是我正在使用的坐标:
第一点:x:7.040283679962158,y:-55.59856033325195
第二点:x:7.04131555557251,y:-55.5977783203125
第三点:x:6.991822718617924,y:-55.5984
第四点:x:7.2029868530932735,y:-55.5984
交点:x:7.039072513580322,y:-55.5984001159668
Wolfram alpha建议x应为约。 7.0405
由于数字非常小并且计算很多,我想在计算之间存在很多损失,这是代码,进行计算 - 抱歉你强迫你阅读这个折扣 - 贫民窟代码。 OSMNode包含经度和纬度坐标 - 因此它们在这个意义上充当Point2D。
private OSMNode calculateIntersectionNode(OSMNode line1Node1, OSMNode line1Node2, OSMNode line2Node1, OSMNode line2Node2) {
double lon1 = line1Node1.getLon();
double lon2 = line1Node2.getLon();
double lon3 = line2Node1.getLon();
double lon4 = line2Node2.getLon();
double lat1 = line1Node1.getLat();
double lat2 = line1Node2.getLat();
double lat3 = line2Node1.getLat();
double lat4 = line2Node2.getLat();
double intersectionLon = ( ( (((lon1*lat2) - (lat1*lon2)) * (lon3-lon4)) - ((lon1-lon2) * ((lon3*lat4) - (lat3*lon4))) ) / ( ((lon1 - lon2) * (lat3 - lat4)) - ( (lat1 - lat2) * (lon3 - lon4)) ) );
double intersectionLat = ( ( (((lon1*lat2) - (lat1*lon2)) * (lat3-lat4)) - ((lat1-lat2) * ((lon3*lat4) - (lat3*lon4))) ) / ( ((lon1 - lon2) * (lat3 - lat4)) - ( (lat1 - lat2) * (lon3 - lon4)) ) );
return new OSMNode(intersectionLon, intersectionLat);
}
我是否会以某种方式在代码中投入更多精度?我是否改变了计算交叉路口的方式或第三种方式 - 我目前在我的脑海里空洞。
提前致谢!
答案 0 :(得分:0)
正如所怀疑的那样,错误是我自己的 - 问题是一个索引错误,由于使用了返回独占索引值的函数,因此很难发现,而我正在使用其他类的包容性
我不知道这里有什么传统 - 我是关闭这个问题还是删除它?