Запрос полигонов в пределах границы представления карты в PostGIS

#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 и все наиболее часто используемые альтернативы есть.