Расчет расстояния до геоинструментов завершается неудачно, без исключения сходимости для нескольких точек широты.

У меня есть несколько точек, из-за которых метод getOrthodromicDistance не работает с исключением в geotools lib, в то время как эти точки являются действительными точками lat lon:

Точка, вызывающая исключение (широта, долгота):

val p1= (5.318765,-75.786109)
val p2= (-6.32907,106.09254)

например, исключение: нет схождения для точек 75 ° 47,2 'западной долготы 06 ° 19,7' южной широты и 106 ° 05,6 'восточной долготы 05 ° 19,1' северной широты. 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)

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


person skonto    schedule 12.08.2015    source источник


Ответы (1)


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

Есть два возможных решения: 1 - отредактируйте GeodeticCalculator, чтобы увеличить количество возможных итераций с 12 до 15, это работает в этом случае, но я не могу гарантировать это в других. Или 2 используйте другой алгоритм, следуя ссылкам из ответов на этот вопрос Я нашел библиотеку GeographicLib на Sourceforge и использовал ее вместо своих очков. Он написан автором (@cffk) статьи , ссылка на которую имеется в другом ответе.

По вашим оценкам, это дает очень разумный вид на 20004 км.

person Ian Turton    schedule 12.08.2015
comment
Я создал отчет об ошибке (osgeo-org.atlassian.net/browse/GEOT- 5191), если хотите его посмотреть - person Ian Turton; 12.08.2015
comment
Да, я тоже исследовал это. Библиотека GeographicLib - это подходящее решение, она отлично работает, потому что в ней реализован другой алгоритм, который сходится для любой пары точек, а Винсенти по дизайну - нет. Буду смотреть баг спасибо! - person skonto; 13.08.2015
comment
Найдите набор из 130 пар точек, которые также можно использовать в качестве тестового примера плохие моменты - person skonto; 13.08.2015
comment
Я отправил этот запрос на вытягивание для геоинструментов для решения этой проблемы. Пожалуйста, попробуйте. (В настоящее время проверки сборки не работают, но я думаю, что это не связано с патчем.) - person cffk; 23.08.2015
comment
Это больше не будет проблемой для GeoTools 14+ благодаря @cffk - person Ian Turton; 30.08.2015