Как эффективно запрашивать большие мульти-полигоны с PostGIS - PullRequest
4 голосов
/ 03 августа 2010

Я работаю с радиокартами, которые кажутся слишком фрагментированными для эффективного запроса. Время ответа составляет 20-40 секунд, когда я спрашиваю, находится ли одна точка внутри мультиполигона (я проверил "в пределах" / "содержит" / "перекрытия"). Я использую PostGIS с GeoDjango для абстрагирования запросов.

Многогранный столбец имеет индекс GiST, и я попробовал VACUUM ANALYZE. Я использую PostgreSQL 8.3.7. и Джанго 1.2.

Карты простираются на большие географические области. Первоначально они были созданы с помощью радиоинструмента с учетом топографии, и поэтому радиоячейки / полигоны фрагментированы .

Моя цель - запросить точки внутри мультиполигонов (то есть домов, которые могут или не могут быть покрыты сигналами).

Все радиокарты состоят из 100 000 - 300 000 вершин (всего) с дико различающимся количеством полигонов. Некоторые из карт имеют менее 10 полигонов. Оттуда он прыгает между 10.000 и 30.000 полигонов. Отношение количества полигонов к вершинам, по-видимому, не влияет на время, затрачиваемое на выполнение запросов.

Я использую проекционную систему координат и использую одну и ту же систему для домов и радиосекторов. Qgis показывает, что радио сектора и карты правильно расположены на местности.

Мои тестовые запросы относятся только к одному дому за раз в пределах одной радиокарты. Я проверил запросы типа «в пределах» / «содержит» / «перекрытия», и результаты такие же:

  • Ответ за секунду, если дом находится «далеко» от радиокарты (я полагаю, это потому, что он находится за пределами ограничительной рамки, которая автоматически используется в запросе).

  • 20-40 секунд, время отклика, если дом / точка находится близко или внутри радиокарты.

Есть ли у меня альтернативные способы оптимизации запросов, или я должен каким-то образом изменить / упростить исходный материал? Любой совет приветствуется.

1 Ответ

3 голосов
/ 04 августа 2010

Hallo

Первым делом я бы разделил мультиполигоны на отдельные полигоны и создал новый индекс. Тогда индекс будет работать намного эффективнее. Теперь весь мультиполигон имеет одну большую ограничивающую рамку, и индекс не может ничего сделать, кроме как сказать, находится ли дом внутри ограничительной рамки. Таким образом, чем меньше полигонов по отношению ко всему набору данных, тем более эффективно использование индекса. Существуют даже методы разделения отдельных полигонов на более мелкие с помощью сетки, чтобы сделать индексную часть запроса еще более эффективной. Но, во-первых, нужно разделить мульти-полигоны на отдельные с помощью ST_Dump (). Если у вас много атрибутов в одной и той же таблице, было бы разумно поместить это в другую таблицу и сохранить только идентификатор, указывающий, к какой радиомарте он принадлежит. В противном случае вы получите много дублированных данных атрибутов.

НТН Никлас

...