PostGIS: ограничительная коробка мультиполигона - PullRequest
3 голосов
/ 11 октября 2010
SELECT id, ST_Box2D(areas) AS bbox FROM mytable;

В этом примере таблица «mytable» содержит два столбца: « id » - это уникальный идентификатор строки и « областей * 1007».* "- это поле geometry , содержащее по одному MULTIPOLYGON на строку.


Это отлично работает для мультиполигонов, содержащих только один многоугольник, но в некоторых строках многоугольники очень распространеныкроме этого, следовательно, ограничивающий прямоугольник не имеет значения, если мультиполигон содержит один полигон в Европе и один в Канаде, например.

Так что мне нужен способ получить один бокс2d на полигон на мультиполигон, но у меня нетнашел как раз пока.Точнее, моя цель - вернуть один мультиполигон на строку, содержащий один box2d на полигон.


Первый пример

  • id : 123
  • area : мультиполигон, содержащий только один овальный многоугольник в Австралии
  • , поэтому bbox должен возвращать мультиполигон, содержащий только один прямоугольник (ограничивающий прямоугольник) в Австралии

Второй пример

  • id : 321
  • area : мультиполигон, содержащий одинкруг в Париже, один круг в Торонто
  • , поэтому bbox должен вернуть мультиполигон, содержащий один прямоугольник в Париже, один прямоугольник в Торонто

Ответы [ 2 ]

5 голосов
/ 11 октября 2010

Вы должны использовать ST_Dump http://postgis.org/documentation/manual-1.5/ST_Dump.html

Тогда вы получите один ряд на каждый многоугольник. Другие поля будут дублироваться при разделении геометрии. Это как агрегатная функция, но наоборот.

Синтаксис становится немного особенным, поскольку он выводит составной тип данных, поэтому вам нужно извлечь геометрическую часть следующим образом:

SELECT (ST_Dump(the_geom)).geom from mytable;

, поскольку это дает вам больше строк в таблице, вам просто нужно создать новую таблицу из запроса.

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

НТН

/ Никлас

Вы хотите, чтобы ваши полигоны тоже были в одном ряду? Я так и думал, но если вам нужна только таблица с bbox, по одной на строку с идентификатором, ссылающимся на исходный мультиполигон (конечно, вы получите один и тот же идентификатор, повторенный для каждой части мультиполигона), тогда вы можете сделать то же просто распаковываем bboxes что-то вроде:

CREATE TABLE newTable AS
SELECT id, BOX2D((ST_Dump(the_geom)).geom) AS myBox FROM originamTable

Боюсь, я действительно не получаю то, что вы хотите, но у вас есть много возможностей с ST_Dump в подобных случаях.

1 голос
/ 11 октября 2010

Вы должны были бы поместить соответствующие биты (скажем, канадский и французский компоненты) отдельно. Лучшим инструментом для этого в PostGIS является аксессор геометрии ST_GeometryN(geometry,int) (ссылка: http://postgis.refractions.net/docs/ST_GeometryN.html). Эта ссылка имеет хороший пример объединения метода доступа с ST_NumGeometries .

ОБНОВЛЕНИЕ ЗА КОММЕНТАРИЙ:

Вот простой пример из Сан-Франциско - эта таблица содержит геометрическое поле с именем the_geom, gid запись 1 - это поле с двумя мультиполигонами, сообщаемое st_numgeometries (обратите внимание, что порядковый номер имеет индекс 1, а не 0):

=> select st_box2d(st_geometryn(the_geom, 1)) from tl_2009_06075_cousub00 \
 where gid = 1;

                                st_box2d                                 
-------------------------------------------------------------------------
 BOX(-123.173828125 37.6398277282715,-122.935707092285 37.8230590820312)
(1 row)

=> select st_box2d(st_geometryn(the_geom, 2)) from tl_2009_06075_cousub00 \
 where gid = 1;

                                  st_box2d                                  
----------------------------------------------------------------------------
 BOX(-122.612289428711 37.7067184448242,-122.281776428223 37.9298248291016)
(1 row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...