Geotools 距离计算失败,几个经纬度点没有收敛异常
Geotools distance calculation fails with no convergence exception for several lat lon points
我有很多点导致 getOrthodromicDistance 方法在 geotools lib 中失败并出现异常,而这些点是有效的经纬度点:
抛出异常的点(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方法不收敛。有什么解决方法吗?
问题是这不是一个简单的计算,因为 Vincenty 算法是一个迭代过程,有些 sets of points 不一定会收敛(在限制集内)。
有两种可能的解决方案 1 - 编辑 GeodeticCalculator 以将可能的迭代次数从 12 增加到 15,这在这种情况下有效,但我不能保证在其他情况下也是如此。或 2 使用另一种算法,遵循来自 this question's answers I found the GeographicLib library at Sourceforge and used that instead with your points. It is written by the author (@cffk) of the paper 链接到其他答案的链接。
根据你的观点,它给出了一个非常合理的 20004 公里。
我有很多点导致 getOrthodromicDistance 方法在 geotools lib 中失败并出现异常,而这些点是有效的经纬度点:
抛出异常的点(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方法不收敛。有什么解决方法吗?
问题是这不是一个简单的计算,因为 Vincenty 算法是一个迭代过程,有些 sets of points 不一定会收敛(在限制集内)。
有两种可能的解决方案 1 - 编辑 GeodeticCalculator 以将可能的迭代次数从 12 增加到 15,这在这种情况下有效,但我不能保证在其他情况下也是如此。或 2 使用另一种算法,遵循来自 this question's answers I found the GeographicLib library at Sourceforge and used that instead with your points. It is written by the author (@cffk) of the paper 链接到其他答案的链接。
根据你的观点,它给出了一个非常合理的 20004 公里。