Другое вычисление ST_Distance с градусами и метрами в PostGIS

#postgresql #geometry #postgis #distance #geography

#postgresql #геометрия #postgis #расстояние #география

Вопрос:

Я заметил, что иногда результаты ST_Distance для типов геометрии неправильно соответствуют результатам для типов географии. Например:

 SELECT ST_Distance('SRID=4326;MULTIPOLYGON(((13.1654379639367 48.0163296656575,
13.1654405823308 48.0163326202901,13.1654809135407 48.0163781648167,
13.1655095556032 48.0164104945946,13.1656825124596 48.0166031792699,
13.1658285825017 48.0167559797112,13.1658385904811 48.0167667179682,
13.1660097634653 48.0169315381006,13.1661737540995 48.0170911295992,
13.166336100685 48.0172329598378,13.1677079127931 48.0150783894135,
13.1677278111466 48.0150450062427,13.1670716137939 48.0148839705059,
13.1667911667995 48.0148062288149,13.1665512255895 48.0147411405409,
13.1665145733757 48.0147311909654,13.1654379639367 48.0163296656575)))'::geometry, 
'SRID=4326;POINT(16.096346 47.2786129)'::geometry);
  

возвращает 3.0197908442784636 в результате в градусах.

Но при вычислении расстояния одних и тех же фигур в метрах:

  SELECT ST_Distance(gg1,gg2) from (select 'SRID=4326;MULTIPOLYGON(((13.1654379639367 48.0163296656575,
 13.1654405823308 48.0163326202901,13.1654809135407 48.0163781648167,13.1655095556032 48.0164104945946,
 13.1656825124596 48.0166031792699,13.1658285825017 48.0167559797112,13.1658385904811 48.0167667179682,
 13.1660097634653 48.0169315381006,13.1661737540995 48.0170911295992,13.166336100685 48.0172329598378,
 13.1677079127931 48.0150783894135,13.1677278111466 48.0150450062427,13.1670716137939 48.0148839705059,
 13.1667911667995 48.0148062288149,13.1665512255895 48.0147411405409,13.1665145733757 48.0147311909654,
 13.1654379639367 48.0163296656575)))'::geography as gg1, 
'SRID=4326;POINT(16.096346 47.2786129)'::geography as gg2) as foo;
  

возвращает 0 метров. Это не может быть правильным. Просматривая фигуры на игровой площадке wkt, расстояние действительно намного превышает 0 метров.

Есть идеи о том, что я могу делать неправильно? Спасибо!

Комментарии:

1. В данном конкретном случае ему не нравится multipolygon (но функция обычно работает с географией multipolygon). Вы можете попробовать обычный трюк, чтобы исправить «странные, но правильные» геометрии / географии, используя st_buffer(gg1,0) (который в этом примере превратит geog в простой полигон)

2. Отлично, это работает! Спасибо!