2010-10-11 2 views
3
SELECT id, ST_Box2D(areas) AS bbox FROM mytable; 

В этом примере таблица «туЬаЫе» содержит две колонки: «идентификатор» это уникальный номер идентификатор строки и «зоны» является геометрия поле содержит MULTIPOLYGON в строке.PostGIS: ограничительную рамку MultiPolygon


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

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


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

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

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

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

ответ

5

Hallo

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

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

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

SELECT (ST_Dump (the_geom)) геометрию из туЬаЫх.

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

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

НТН

/Никлас

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

Создать таблицу Новая_таблица в SELECT, ID, Box2D ((ST_Dump (the_geom)) геом.) как myBox от originamTable

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

+0

(ST_Dump()). Geom - это именно то, что мне нужно (и я уверен, что не нашел бы его через миллион лет). Благодаря :) – wildpeaks

1

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

ОБНОВЛЕНИЕ НА Комментарий:

Вот простой пример из Сан-Франциско - эта таблица содержит поле геометрии под названием the_geom, gid запись 1 представляет собой поле с двумя multipolygons как сообщает 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) 
+0

Ну, я тоже пробовал это раньше: SELECT numgeometries (areas) AS count, geometryn (области, generate_series (1, numgeometries (areas))) AS bbox FROM mytable; Однако я не знаю, где я мог бы вставить инструкцию st_box2d в инструкцию, и как ее агломерация в строке (st_collect была бы моей первой идеей, но это сложно), и я не был уверен, вправо. – wildpeaks

Смежные вопросы