2015-08-12 6 views
4

У меня есть ряд точек, которые делают метод getOrthodromicDistance потерпеть неудачу с исключением в GeoTools Lib, в то время как эти точки являются допустимой LAT точкой LON:расчета расстояния GeoTools не удается без исключения сходимости для нескольких лат точек 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 есть (широта, долгота), как указано выше, setStartingGeographicPoint, setDestinationGeographicPoint need (lon, lat) .

Версия используется:

 <dependency> 
      <groupId>org.geotools</groupId> 
      <artifactId>gt-referencing</artifactId> 
      <version>13.2</version> 
     </dependency> 

В питона работ, как и ожидалось:

>>> from geopy.distance import vincenty 
>>> pt1= [5.318765,-75.786109] 
>>> pt2= [-6.32907,106.09254] 
>>> vincenty(pt1 , pt2) 
Distance(19791.6883647) 

Это метод orthodromicDistance в org.geotools.referencing.datum.DefaultEllipsoid, который не сходится. Любые обходные пути?

ответ

2

Проблема заключается в том, что это не простой расчет, поскольку алгоритм Винчентий является итеративным процессом, а некоторые sets of points не обязательно сходятся (в пределах установленного предела).

Существует два возможных решения: 1 - отредактируйте GeodeticCalculator, чтобы увеличить число возможных итераций с 12 до 15, это работает в этом случае, но я не могу гарантировать это в других. Или 2 используйте другой алгоритм, следуя ссылкам из this question's answers. Я нашел GeographicLib library у Sourceforge и использовал это вместо ваших очков. Это написано автором (@cffk) paper, связанным с другим ответом.

Для ваших целей это дает очень разумный вид 20004 Km.

+0

Я поднял сообщение об ошибке (https://osgeo-org.atlassian.net/browse/GEOT-5191), если вы хотите посмотреть его –

+0

Да, я также изучил его. Библиотека GeographicLib - это решение кандидата, которое оно работает отлично, потому что он имеет другой реализованный алгоритм, который сходится для любой пары точек, в то время как Vincenty по дизайну этого не делает. Я буду следить за ошибкой thnx! – skonto

+0

Пожалуйста, найдите набор из 130 пар точек, которые также могут служить в качестве тестового примера [плохие баллы] (https://www.dropbox.com/s/39jaqaitckzjcja/badpoints.txt?dl=0) – skonto