Создание круга в 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, чтобы избежать репроекций и повысить производительность.

angelcervera
источник
1
Как вы измерили радиусы, чтобы узнать, что они не 600 км?
Подземье
1
@underdark Я знаю, что расстояние между двумя городами и круг, образованный с использованием центра одного из этих городов, не распространяются на другие города. Я проверяю расстояние между двумя городами, используя gmap-pedometer.com
angelcervera
3
Это похоже
underdark
@underdark При использовании SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));return более 100 км разницы, уважайте gmap-pedometer.com, но если я считаю эту длину правильной, радиус окружности будет идеальным. Но люди используют первое расстояние как радиус, а не расстояние, возвращаемое st_distance. Возможно ли преобразовать первое расстояние во второе?
angelcervera

Ответы:

15

Попробуй это:

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

Это переворачивает географию, затем использует встроенный выбор SRID, чтобы (по иронии судьбы) перевернуть обратно в геометрию, где запускается хороший плоский буфер, а затем переворачивается обратно. Проблема с вашим подходом в Mercator заключается в том, что Mercator не сохраняет расстояние. Использование более подходящей локальной проекции дает лучшие результаты, и это то, что происходит в вышеупомянутом методе.

Пол Рэмси
источник
4

Вы можете увеличить значение quad_seg, чтобы получить более точный круг. Чтобы получить реальный круг, вы должны работать с криволинейным типом геометрии, но я не знаю, какое программное обеспечение может это показать.

Точность srid 90013 также очень плохая, поскольку это проекция, охватывающая весь мир.

Вы получите более точный результат с локальной проекцией.

Никлас Авен
источник
@ nicklas-aven Возможно ли различие в 100 км на расстоянии 600 км, потому что я использую проекцию 900913, а не 4326?
angelcervera
1
Да, это возможно. проверьте Полса, прокомментируйте ее, когда я не мог поверить в эту неточность gis.stackexchange.com/questions/3264/… . дело в том, что 4326 не проецируется.
Никлас Авен
3

Это зависит от того, где создаются ваши круги. Они возле экватора или ближе к полюсам?

Посмотрите на эту карту . Как вы думаете, Антарктида или Гренландия действительно такие большие? Это проекция, которую вы используете, верно?

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

И после всего этого, я думаю, я должен наконец ответить на ваш вопрос :)

Никлас сказал, что это хороший совет. Есть ли конкретный прогноз для вашего района, который будет работать лучше?

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

ОБНОВЛЕНИЕ: Поскольку теперь мы знаем, что ваши данные находятся в Испании, вы рассматривали возможность их хранения в локальной проекции, такой как UTM Zone 31N , выполнения ваших операций с их использованием, а затем проецирования их обратно в Google Web Mercator?

Раги Язер Бурхум
источник
1
+1 за использование типа географии для карт, охватывающих большие области. проблема здесь в том, что в postgis нет встроенной буферной функции для типа географии. но есть встроенное приведение к «лучшему srid», построение буфера и затем возврат к 4326. Таким образом, знание ваших данных и выбор srid вручную дает лучший контроль.
Никлас Авен
Никлас, ты прав насчет кастинга, и я согласен с тобой на 100% относительно местного прогноза (т.е. зная твои данные). Тем не менее, если ответ заключается в том, что он просто хочет иметь «всемирные» данные, ИМХО, логика приведения внутри типа Geography сделает гораздо лучшую работу по выяснению того, какой SR подходит для этой конкретной дистанционной операции, а не какой-либо другой. сложная пользовательская логика. Еще одна хорошая вещь о типе geography - то, что в настоящее время многие операции приводятся к декартовой математике, операции продолжают обновляться для использования сферной математики.
Раги Язер Бурхум
2

Вы можете использовать новый тип геометрии SQL / MM Part 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()).

Майк Т
источник