Широта / Длинная пространственная привязка - PullRequest
0 голосов
/ 07 апреля 2020

Я новичок в PostGIS, неправильно понимаю площадь многоугольника, мои данные взяты из карт Google, я знаю, что площадь многоугольника составляет 11 акров, но площадь, возвращаемая st_area, не совпадает, я уже ссылается на несколько ссылок, как показано ниже, но не может решить проблему, Inte rnet говорит, что Google следует 4326 Пространственные ссылки, я много пробовал, не могли бы вы помочь, прикрепленное изображение является полигоном из карт Google.

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

https://gis.stackexchange.com/questions/169422/how-does-st-area-in-postgis-work

Как преобразовать пару широта / долгота в тип географии PostGIS?

https://gis.stackexchange.com/questions/56862/what-spatial-reference-system-do-i-store-google-maps-lat-lng-in/56925

17.475197 78.389024 17.4771 78.39044 17.475657 78.391652 17.474408 78.390847 17.475197 78.389024

l_polygon_text = 'MULTIPOLYGON ((17.4771000000000001 78.390100.400 78.390199.499 7899149999) +0,3890240000000063, 17,4756570000000018 +78,3916519999999934, 17,4751970000000014 78,3890240000000063, 17,4744080000000004 +78,3908469999999937, 17,4771000000000001 78,3904399999999981)));

st_area(ST_GeometryFromText(l_polygon_text,4326))
st_area(ST_GeometryFromText(l_polygon_text,2163));
st_area(ST_GeometryFromText(l_polygon_text,2249));
st_area(ST_GeometryFromText(l_polygon_text,3859));

ST_AREA(ST_Transform(ST_GeomFromText(l_polygon_text,4326),31467));
ST_Area(ST_Transform(ST_SetSRID(ST_GeomFromText(l_polygon_text),4326),900913));

многоугольник

1 Ответ

0 голосов
/ 07 апреля 2020

В PostGIS координаты должны быть сначала выражены как долгота, а затем широта. Google использует обратное.

После замены координат в правильном порядке вы не можете напрямую вызвать st_area, иначе вы получите область в «квадратных градусах», которая не имеет смысла. Вам придется проецировать на подходящую локальную систему координат, или вы можете использовать тип geography, который будет возвращать площадь в м2.

select st_area(st_geogFromText('MULTIPOLYGON(((78.3904399999999981 17.4771000000000001, 78.3890240000000063 17.4751970000000014,78.3916519999999934 17.4756570000000018,78.3890240000000063 17.4751970000000014,78.3908469999999937 17.4744080000000004,78.3904399999999981 17.4771000000000001)))'));
      st_area
--------------------
 26956.897848576307

При этом приведенный вами пример составляет около 6,5 акров, а не 11, поскольку полигон не определен должным образом:

enter image description here

...