Створення кола в PostGIS?


22

Я використовую PostGIS 1.5.2, з геометріями в SRID: 900913. Мені потрібно створити кола, використовуючи список точок у центрі, радіусом 600 кілометрів. Я використовую цей запит:

INSERT INTO circles (geom) (
   SELECT ST_Buffer(point, 600000, 'quad_segs=8') 
   FROM points
);

Але створені кола мають не радіус 600 кілометрів (радіус знаходиться біля цієї довжини, але не точно).

Чи існують інші методи створення кіл в PostGIS?

ПРИМІТКА. Інформація, представлена ​​з Іспанії. Правильна проекція становить 4326, але клієнт використовує растри Google, тому я зберігаю дані в 900913, щоб уникнути повторних проекцій та підвищення продуктивності.


1
Як ви виміряли радіуси, щоб дізнатись, що вони не за 600 км?
underdark

1
@underdark Я знаю, що відстань між двома містами та колом, згенерованих за допомогою центру одного міста, не поширюється на інше місто. Я перевіряю відстань між двома містами за допомогою gmap-pedometer.com
angelcervera

3
Це звучить, пов'язане з gis.stackexchange.com/questions/10148/…
underdark

@underdark Використовуючи SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));повернення на відстань більше 100 км, поважайте gmap-pedometer.com, але якщо я вважаю, що ця довжина є правильною, радіус кола є ідеальним. Але люди використовують першу відстань як радіус, не відстань, повернуту st_distance. Чи можливо перетворити першу відстань на другу?
angelcervera

Відповіді:


15

Спробуйте це:

 SELECT ST_Transform(geometry( 
            ST_Buffer(geography( 
                ST_Transform( point, 4326 )), 
                600000)), 
            900913) FROM points`

Це перетворюється на географію, потім використовує вбудований вибір SRID, щоб (за іронією долі) повернути назад в геометрію, де запускається хороший планарний буфер, а потім повертається назад. Проблема з вашим підходом до Меркатора полягає в тому, що Меркатор не зберігає відстань. Використання більш підходящої локальної проекції дає кращі результати, і саме це відбувається в описаному вище способі.


4

Ви можете збільшити значення quad_seg, щоб отримати більш точне коло. Щоб отримати справжнє коло, вам потрібно працювати з вигнутим типом геометрії, але я не знаю, яке програмне забезпечення це може показати.

Точність srid 90013 також дуже погана, оскільки це проекція, що охоплює весь світ.

Ви отримаєте більш точний результат за допомогою локальної проекції.


@ nicklas-aven Чи можливо 100 км різниці на відстані 600 км, тому що я використовую проекцію 900913, а не 4326?
angelcervera

1
так, це можливо. перевірити, Полс коментує її, коли я не міг повірити в цю неточність gis.stackexchange.com/questions/3264/… . річ у тому, що 4326 не прогнозується.
Nicklas Avén

3

Це залежить від того, де створюються ваші кола. Вони поблизу екватора чи ближче до полюсів?

Погляньте на цю карту . Ви вважаєте, Антартіка чи Гренландія насправді такі великі? Це проекція, яку ви використовуєте, правда?

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

І зрештою, я думаю, я повинен нарешті відповісти на ваше запитання :)

Те, що сказав Ніклас, було гарною порадою. Чи є конкретна прогноза для вашої місцевості, яка б працювала краще?

В іншому випадку ви можете переглянути новий тип географії PostGIS . Тим не менш, найбільш відповідна відповідь залежить від того, де розміщені ваші дані.

ОНОВЛЕННЯ: Оскільки тепер ми знаємо, що ваші дані знаходяться в Іспанії, чи дивились ви на зберігання їх у локальній проекції, як UTM Zone 31N , виконуючи свої операції за допомогою цього, а потім проектували їх назад у веб-Mercator Google?


1
+1 для використання типу географії для карт, що охоплюють великі райони. Проблема тут полягає в тому, що в postgis немає вбудованої буферної функції для типу географії. але є вбудований формат "кращого рівня", будуючи буфер, а потім повертаючись до 4326. Отже, знання даних та вибір сітки вручну дає кращий контроль.
Nicklas Avén

Ніклас, ви вірно ставитесь до кастингу, і я згоден з вами на 100% щодо локальної проекції (тобто знання ваших даних). Тим не менш, якщо відповідь полягає в тому, що він просто хоче мати "світові" дані, IMHO, логіка лиття всередині типу "Географія" зробить набагато кращу роботу при з'ясуванні того, що SR підходить для цієї конкретної дистанційної операції, а не будь-який інший складна користувацька логіка. Ще одна гарна річ щодо типу географії - це те, що хоча багато операцій присвячені декартовій математиці, операції постійно оновлюються для використання сферичної математики.
Рагі Ясер Бурхум

2

Ви можете використовувати новітню геометрію типу SIR / MM Частина 3 типу CIRCULARSTRING та / або CURVEPOLYGON.

Однак слід попередити, що підтримка цього типу обмежена як із внутрішніми функціями, так і із зовнішніми програмами. Ви можете використовувати ST_CurveToLine, щоб допомогти візуалізувати його.

Крім того, це дещо відсторонення (станом на PostGIS 2.0 svn) SELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry)є лише приблизним наближенням π . (Порівняйте 3.14033115695475 з 3.14159265358979 від pi()).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.