Почему st_distance («полигон с северного полюса», «точка в Италии») в результате дает мне «0»? - PullRequest
3 голосов
/ 20 января 2020

Я разрабатываю приложение, используя PostgreSQL в качестве базы данных; Моя цель - заархивировать данные полигонов в географическом формате, чтобы я мог легко их визуализировать, используя интеграцию pgAdmin OpenStreetMap, когда делаю какой-либо запрос. Моя проблема в том, что когда я пытаюсь показать расстояние в метрах между многоугольником, расположенным приблизительно на северном полюсе, и точкой, расположенной в Италии, это расстояние дает мне результат '0', и я знаю, что расстояние равно нулю, когда многоугольник сама содержит смысл ... но это не наш случай. Приведенный ниже код является запросом, который я использовал для этого примера:

SELECT 
  ST_Distance('POLYGON((88.20524 80.31286,89.30506 88.84312,83.62463 89.51824,88.20524 80.31286))'::geography, 
  ST_MakePoint(14.295750, 40.898207)::geography)

Можете ли вы помочь мне решить эту проблему? Спасибо.

1 Ответ

2 голосов
/ 20 января 2020

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

Уменьшите десятичную точность на 1 di git, например, ST_MakePoint(14.29575, 40.89820), и это должно работать. Это не решение, которым я очень горжусь, но, предполагая, что это ошибка в ST_Distance, я считаю, что это приемлемый обходной путь.

SELECT 
  ST_Distance('POLYGON((88.20524 80.31286,89.30506 88.84312,83.62463 89.51824,88.20524 80.31286))'::geography, 
  ST_MakePoint(14.29575, 40.89820)::geography);

   st_distance    
------------------
 5250149.46929165
(1 Zeile)

Тестирование среды

SELECT version();
                                                                   version                                                                   
---------------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 12.1 (Ubuntu 12.1-1.pgdg16.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609, 64-bit
(1 Zeile)

SELECT postgis_full_version();
                                                                                        postgis_full_version                                                                                         
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 POSTGIS="3.0.0 r17983" [EXTENSION] PGSQL="120" GEOS="3.7.1-CAPI-1.11.1 27a5e771" PROJ="Rel. 4.9.2, 08 September 2015" LIBXML="2.9.3" LIBJSON="0.11.99" LIBPROTOBUF="1.2.1" WAGYU="0.4.3 (Internal)"
(1 Zeile)

Я пытаюсь разобраться в этом наборе результатов, но кажется, что ST_Distance не может справиться с определенная комбинация десятичных точек между точками и многоугольниками. С указанным полигоном он не будет работать, если точка имеет более 5 десятичных цифр :

WITH j (p1,p2) AS (
  VALUES ('POLYGON((88.20524 80.31286,89.30506 88.84312,83.62463 89.51824,88.20524 80.31286))',
          'POINT(14.295750 40.898207)')
) 
SELECT 
  ST_Distance(ST_AsText(p1,5)::GEOGRAPHY,
              ST_AsText(p2,5)::GEOGRAPHY) AS five_digits,
  ST_Distance(ST_AsText(p1,6)::GEOGRAPHY,
              ST_AsText(p2,6)::GEOGRAPHY) AS six_digits
FROM j;

   five_digits    | six_digits 
------------------+------------
 5250148.38625588 |          0
(1 Zeile)

Дополнительная информация:

  • ST_AsText() - максимальные десятичные цифры
...