Geotools距离计算在多个纬度经度点上失败,出现无收敛异常。

5

我有一些问题,导致geotools库中的getOrthodromicDistance方法失败并抛出异常,尽管这些点是有效的纬度和经度点:

抛出异常的点(纬度,经度):

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方法无法收敛。有什么解决方法吗?
1个回答

3
问题在于这不是一个简单的计算,因为Vincenty算法是一个迭代过程,有些点集并不一定会收敛(在限制集内)。
有两种可能的解决方案:1-编辑GeodeticCalculator以将可能的迭代次数从12增加到15,在这种情况下可以解决问题,但我不能保证在其他情况下也能解决。或2-使用另一种算法,根据此问题的答案中的链接,我在Sourceforge上找到了GeographicLib库并使用它来处理您的点。它由另一个答案中链接的论文的作者(@cffk)编写。
对于您的点,它给出了一个非常合理的20004公里。

我已经提交了一个错误报告(https://osgeo-org.atlassian.net/browse/GEOT-5191),如果您想关注它。 - Ian Turton
是的,我也调查了一下。GeographicLib库是一个备选解决方案,它可以很好地工作,因为它实现了不同的算法,可以收敛任何一对点,而Vincenty则不行。我会关注这个bug的,谢谢! - skonto
请找到一组包含130对点的数据,这也可以作为一个测试用例。坏点 - skonto
1
我已经向geotools提交了此pull request,以解决此问题。 请尝试它。 (目前,构建检查未能通过;但我认为这与补丁无关。) - cffk
1
这将不再是GeoTools 14+的问题,感谢@cffk。 - Ian Turton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接