#postgresql #google-maps #postgis
#postgresql #google-карты #postgis
Вопрос:
Я новичок в PostGIS. У меня есть таблица, которая содержит границы области в полигональном типе. Я хотел бы отобразить полигон на карте Google. Каждый раз, когда изменяется граница представления карты Google, приложение должно запрашивать PostGIS для любых полигонов в этом представлении карты. Может кто-нибудь помочь мне начать?
Комментарии:
1. ST_Intersects(viewbbox, geom) где geom — столбец геометрии в вашей таблице polygons — это пространственная функция, которую вы ищете. Однако вам нужно будет предоставить дополнительную информацию о том, как вы отображаете это, запрашиваете это и т. Д. Из Google Maps.
2. Спасибо! При отображении я просто нарисую полигоны, используя пары Lat / Lng. Итак, входные данные для моего запроса — это широта / спг координат NE и SE.
Ответ №1:
Select * from Polygons where ST_Intersects(
ST_MakeBox2D(ST_MakePoint(lon1, lat1), ST_MakePoint(lon2, lat2)),
geom);
предполагая, что у вас есть таблица с именем Polygons и что ваше поле геометрии называется geom. Вам также необходимо убедиться, что у вас есть пространственный индекс в поле геометрии с:
Create index ix_spatial_geom on Polygons using gist (geom);
Если вы планируете загружать данные из Postgis в Google Maps, посмотрите на функцию AS_GeoJSON в Postgis, которая позволяет создавать GeoJSON непосредственно из Postgis, которые затем можно загружать непосредственно в Google Maps, см. Этот пример: загрузить GeoJSON в Google Maps
Редактировать:
Вы можете установить SRID при импорте данных с помощью переключателя -s. Настоятельно рекомендуется явно установить SRID для столбца либо при создании столбца, либо при последующем запуске обновления с помощью UpdateGeometrySRID, поскольку это помогает как обеспечить целостность, так и включить преобразование из одной системы координат в другую.
Получив данные в указанной системе координат, вы также можете использовать ST_Transfrom для преобразования из одной системы координат в другую «на лету», например, из 4326 в 3857 (прогнозируемые метры плиток Google Maps).
Комментарии:
1. Спасибо!!! Однако ваш запрос не возвращает мне никаких данных, хотя я знаю, что в переданных мной координатах должны быть полигоны. Каков наилучший способ отладить это? Кстати, мой тип полигона — геометрия geom (полигон, 3347).
2. Вот мой запрос. выберите * из test2, где ST_Intersects(ST_MakeBox2D(ST_MakePoint(43.376395093503234, -80.09694519042966), ST_MakePoint(43.97234865260645, -78.72365417480466)), geom); Я попытался переключить положение широты / lng.
3. Я думаю, я нашел, почему запрос ничего мне не возвращает. Похоже, что координаты, сохраненные в типе данных geometry, не соответствуют координатам карты Google.
4. Я думаю, я понял. Когда я импортировал свой shp в postgis, я не использовал правильную систему координат. Вот почему координаты выглядят так не похоже на Google map. Я использовал 4326 для повторного импорта данных, и это работает. Вот мой запрос:
SELECT * FROM test_2013_4326_f WHERE geom amp;amp; ST_SetSRID(ST_MakeBox2D(ST_Point(-80.09694519042966, 43.376395093503234), ST_Point(-78.72365417480466, 43.97234865260645)),4326)
5. Вероятно, вы хотите явно установить srid для своего столбца при импорте или запустить массовое обновление для создания координат в используемом вами SRID, а не использовать ST_SetSRID в своих запросах. Я обновил свой ответ, основываясь на ваших комментариях.
Ответ №2:
ST_Intersects, вероятно, является лучшим решением для того, что вы хотите.
Если вы новичок в Postgis, я рекомендую вам использовать их шпаргалку Postgis. В этом документе представлены все основные и наиболее часто используемые команды Postgis, которые вы, вероятно, будете использовать сейчас, и это поможет вам быстро освоить его, не читая всего руководства.
Как использовать ST_Intersect и все наиболее часто используемые альтернативы есть.