#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. Отлично, это работает! Спасибо!