Выбор по ограничительной рамке с PostGIS

12

У меня есть большой набор данных в базе данных PostGIS. Я просматриваю его через веб-интерфейс, который загружает данные как GeoJSON. Слишком много данных, чтобы предоставить клиенту все сразу (10 с лишним МБ ...), поэтому я хотел бы получить область данных внутри ограничительной рамки, образованную краями окна (пунктирная линия на изображении ниже ). Получить координаты для точек f и g легко.

Вопрос 1: Это хороший способ делать вещи? Стоит ли думать о том, чтобы кэшировать их как тайлы или этот метод достаточно эффективен?

Вопрос 2: Как я могу получить только данные в этой ограничительной рамке?

Вопрос 3: Если фигура перекрывает край ограничительной рамки (например, фигура А ниже), есть ли простой способ обрезать ее, как это запрашивается, как на втором изображении?

введите описание изображения здесь

Mr_Chimp
источник
Какой зритель вы используете на клиенте?
Подземье
Mapstraction. В настоящее время я использую OpenLayers в качестве поставщика.
Mr_Chimp

Ответы:

8

просто измените порядок вопросов, и у вас есть процедура:

2) Выберите только то, что пересекает bbox ( ST_Intersects).
3) Пересечь его с bbox, чтобы обрезать полигоны ( ST_Intersection).
1) Создать новую таблицу с результатами ( CREATE TABLE newtable AS SELECT...).

Документы ST_Intersection содержат пример кода. Вам нужно будет адаптировать его и использовать ST_PolygonFromText в качестве bbox.

Pablo
источник
4

Я думаю, что большинство (все) веб-клиенты (и настольные ГИС тоже) делают это. Вы не можете отправить весь набор данных.

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

Установить этот ограничивающий флажок для получения данных будет очень быстро (если у вас есть пространственный индекс), но, конечно, это не бесплатно. Вы заплатите с некоторой вычислительной мощностью.

Как было сказано ранее: чтобы найти полигоны внутри вашего экстента, вы используете ST_Intersects.

Чтобы получить только часть внутри вашего экстента, используйте ST_Intersection, но не делайте этого. ST_Intersection - дорогостоящий процесс. Если у вас нет очень больших полигонов, я думаю, что лучше отправлять целые полигоны.

Но я думаю, что вы хотите сделать это на лету вместо того, чтобы положить это в стол

Никлас Авен
источник