Об’єднання безлічі маленьких багатокутників для формування більшого багатокутника за допомогою PostGIS?


47

У мене є наступний шар за допомогою SRID 27700 в postgis:

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

Це кожен адміністративний регіон Великобританії, і (як видно з угруповання кольорів) кожен з них має текстове поле із зазначенням округу, в якому вони перебувають.

Що я хотів би зробити, це зробити більші повітові багатокутники з менших в даному окрузі, так що ЕГ на малюнку, перш за все, багатокутники кольору сліз, утворювали б один великий багатокутник з єдиного зовнішнього кільця, який містить усі поліси в цьому Колір, як і мудрий весь фіолетовий, коричневий, рожевий, сірий тощо, повинен утворювати один багатокутник.

Я вже спробував таке:

insert into parishesmerged (geometry)
select astext(multi(ST_Union(the_geom))) as the_geom from parishes
group by county_name

Але він продовжує генерувати розбиті геометрії, які потім у мене виникають великі проблеми з обробкою.

Я намагаюся зробити простішу карту на рівні округу з основними зонами випуску в Росії.

Будь-які рішення також не повинні бути в Postgis, у мене встановлений повний стек OS4Geo, остання версія QGis та більше утиліт, ніж я можу потиснути палицю.

Єдині речі, яких у мене немає, - це такі великі хлопчики, як ArcGis (хоча у мене, можливо, десь лежить стара карта)


Для запису, набір даних, який я намагаюся створити, - це супровід книги GIS, яку я пишу, спрямованої на програмістів .NET, які бажають писати GIS-програми за допомогою .NET


Спробувавши запропоновані нижче пропозиції, найкращим було рішення «Пол Рамсейс».

Зараз у мене є приємний спрощений файл повітів та районів, який досить простий для моєї книги, але достатньо складний, щоб я міг продемонструвати цікавий геопросторовий SQL.

Незважаючи на те, що рішення Павла в кінцевому підсумку було тим, що працювало для мене, я також звернув на інші відповіді на такі речі, як спрощення карти багатокутника та подальше зниження складності.

На те, що я спостерігав, роблячи це, однак, хоча ST_Collect дійсно швидше, ніж ST_Union, біг на біг, він також був головним чином відповідальним за зламані геометрії. Моя здогадка, збільшення швидкості виходить за рахунок меншої точності основної функції.


Цей процес відомий як «розчинити». Я не маю досвіду з PostGIS, але я вважаю, що ви можете використовувати команду ST_Union, щоб виконати розпуск.
dmahr

Привіт dmahr, спасибі за роз’яснення, не був впевнений, як це називається, проте якщо ви прочитаєте моє запитання, ви побачите, що я вже спробував це :-)
shawty

На жаль, не бачив цього. Ви пробували операцію select без astext(multi())частини? Я просто закінчую те, що бачу в інших прикладах розкриття PostGIS.
dmahr

Ще не, спробую це зараз. Ткс. Чи є у вас посилання на приклади розчинення?
shawty

Будь ласка, відредагуйте для експресу, хочете ви "єдине зовнішнє кільце" чи ні. (див. мою відповідь)
Пітер Краус

Відповіді:


43

ST_Union працював би, але робота на вашій лінії майже точно не є чистою. Тож межі ваших дрібниць не всі так до вподоби. Ви можете обережно прив’язати їх до сітки, щоб спробувати збільшити шанси на те, що вершини вирівнюються, але я думаю, що у вас все одно буде кілька випадків, які не працюють. Або вони будуть поза толерантністю, або, швидше за все, будуть місця, де вершини не спарені, тому на одній стороні є лінія, а з іншого - вершина.

 CREATE TABLE merged AS
 SELECT ST_Union(ST_SnapToGrid(the_geom,0.0001)) 
 FROM parishes
 GROUP BY county_name;

Якщо у вас є PostGIS 2.0, побудова топологічної структури з толерантністю може привести вас до відповіді, яку ви шукаєте, якщо у вас є удача.


Хороший ключ для корекції геометрії, але про "... один великий багатокутник з єдиного зовнішнього кільця, який містить усі поліси ..."?
Пітер Краус

Я не знав про "SnapTo", спробую :-) Tks. На жаль, ні, поки не використовується PG 2, однак оновлення вже знаходиться в стадії розробки.
shawty

Не впевнений, що ваш синтаксис правильний. На postgis.net/docs/ST_Union.html немає підпису, який приймає число у другому параметрі.
Арен Камбре

Ти маєш рацію, круглі дужки опинилися в неправильному місці. Відредаговано.
Пол Ремзі

є еквівалент цьому mysql? я продовжую отримувати, Incorrect parameter count in the call to native function 'ST_Union'і я не знаю, чи це обмеження mysql.
Джейен

7

Ви говорите, що потрібно "... сформувати один великий багатокутник з єдиного зовнішнього кільця, який містить усі поліси ...". ST_ExteriorRing роблять це,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_Union(GEOM)))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

Ви можете використовувати ST_Union (), як було запропоновано, або протестувати за допомогою ST_Collection ().


ПРИМІТКИ: щоб уникнути невеликих лупів або "зламаних геометрій", ви можете використовувати st_convexhull та / або ST_Simplify для кожного geom,

SELECT ST_MakePolygon(ST_ExteriorRing(ST_union(ST_Simplify(GEOM,0.5))))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

і перевірити свої геометрії,

SELECT * FROM (
   SELECT gid, ST_IsValid(geom) as valid, ST_IsSimple(geom) as simple 
   FROM GEOMTABLE) AS t  
WHERE NOT(valid AND simple); 

Вибачте за плутанину: Що я мав на увазі під своїм описом, це один більший багатокутник, створений з менших, я розумію, що залежно від контексту "Зовнішнє кільце" може означати різні речі для різних людей, я мав намір описати один багатокутник, створений з межа, присутня навколо кожної групи полігонів.
shawty

7

Функція ST_Collect - це "сукупна" функція в термінології PostgreSQL

" SELECT ST_Collect(GEOM) FROM GEOMTABLE GROUP BY ATTRCOLUMN" поверне окрему GEOMETRYCOLLECTION для кожного окремого значення ATTRCOLUM

http://postgis.net/docs/ST_Collect.html

Примітка: ST_Collect набагато швидше, ніж ST_Union


3
Я спробував це і отримав трохи інші результати, однак чи потрібна колекція геометрії? Я, по суті, намагаюся зробити один великий багатокутник, необов'язково з отворами в ньому (конкретно в Дербіширі та Ноттінгемширі, де обидва дербі та Ноттінгем утворюють окремі райони прямо в центрі. Хоча я спостерігав різницю швидкостей, так що це kewl.
shawty

2

З вашого запитання я припускаю, що ви використовуєте продукт "Межі лінії" Ordnance Survey. Якщо це так, то він вже включає набір даних на рівні округу, тому немає необхідності намагатися генерувати його самостійно з парафіяльних районів нижчого рівня.

Якщо ви не використовуєте Boundary-Line, то я рекомендую вам зробити так, як це безкоштовно за ліцензією на OpenData на ОС і має рівень графства як файл форми, який ви можете завантажувати безпосередньо в PostGIS.


2
Як щодо надання посилання тим, хто цього не знає? Дякую.
Jonatr

1
Привіт CHEnderson, ви насправді правильні, так, я використовую набір даних прикордонного шару з ОС Opendata, на жаль, межі округу не завершені, фактичний файл форми графства включає лише ті, які названі графствами, райони Лондона містять райони навколо У всіх Лондоні та інших файлах є деякі частини, деякі нижчий та менший рівні, ніж інші. Єдиний файл, у якому є весь контур Великобританії, а згодом і будь-який шанс витягти всі графства верхнього рівня та муніципальні межі одним шаром, - це парафіяльний шар, отже, чому я намагаюся це зробити.
shawty

Для тих, хто цікавиться, ви можете завантажити межі округу та інше тут: ordnancesurvey.co.uk/oswebsite/products/os-opendata.html
shawty
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.