我有一些要点使getOrthodromicDistance方法在geotools lib中失败,但是这些点是有效的lat lon点:
抛出异常的点(lat,lon):
val p1= (5.318765,-75.786109)
val p2= (-6.32907,106.09254)
例外: 点75°47,2'W 06°19,7'S和106°05,6'E 05°19,1'N没有收敛。 java.lang.ArithmeticException:点75°47,2'W 06°19,7'S和106°05,6'E 05°19,1'N没有收敛。 在org.geotools.referencing.GeodeticCalculator.computeDirection(GeodeticCalculator.java:1073)
Scala中使用的代码:
def latlonDistance(p1:(Double,Double), p2:(Double,Double)):Double={
val world= new GeodeticCalculator()
world.setStartingGeographicPoint(p1._2, p2._1)
world.setDestinationGeographicPoint(p2._2, p1._1)
world.getOrthodromicDistance
}
注意:我在latlonDistance中传递的点格式是(lat,lon),如上所述,而setStartingGeographicPoint,setDestinationGeographicPoint需要(lon,lat) 顺序。
使用的版本:
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-referencing</artifactId>
<version>13.2</version>
</dependency>
在python中按预期工作:
>>> from geopy.distance import vincenty
>>> pt1= [5.318765,-75.786109]
>>> pt2= [-6.32907,106.09254]
>>> vincenty(pt1 , pt2)
Distance(19791.6883647)
它是org.geotools.referencing.datum.DefaultEllipsoid中的orthodromicDistance方法,它不会收敛。任何解决方法?
答案 0 :(得分:2)
问题在于,这不是一个简单的计算,因为Vincenty算法是一个迭代过程,而一些sets of points不必收敛(在限制集内)。
有两种可能的解决方案1 - 编辑GeodeticCalculator以将可能的迭代次数从12增加到15,这在这种情况下有效,但我无法在其他情况下保证。或者2使用另一种算法,按照this question's answers的链接,我在Sourceforge找到了GeographicLib library,并将其用于您的积分。它由另一个答案中链接到的paper的作者(@cffk)撰写。
对于你的积分,它给出了一个非常合理的20004公里。