Viele kleine Polygone verbinden, um mit PostGIS ein größeres Polygon zu bilden?

47

Ich habe die folgende Schicht mit SRID 27700 in Postgis:

Bildbeschreibung hier eingeben

Es ist jede Verwaltungsregion in Großbritannien, und (wie Sie an der Farbgruppierung erkennen können) jede hat ein Textfeld, in dem die Grafschaft angegeben ist, in der sie liegen.

Was ich tun möchte, ist, größere County-Polygone aus den kleineren in einem gegebenen County zu machen, so dass ZB im Bild vor allem die blaugrünen Farbpolygone ein großes Polygon aus dem einzelnen äußeren Ring bilden, der alle Polys darin enthält Farbe, wie weise alle lila, braun, rosa, grau usw. sollten alle ein Polygon bilden.

Ich habe schon folgendes ausprobiert:

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

Aber es werden immer wieder gebrochene Geometrien erzeugt, die ich dann nur schwer weiterverarbeiten kann.

Ich versuche, eine einfachere Karte auf Kreisebene mit den Hauptausgabegebieten in zu erstellen.

Alle Lösungen müssen auch nicht in Postgis sein, ich habe den vollständigen OS4Geo-Stack installiert, die neueste Version von QGis und mehr Utensilien, als ich aushalten kann.

Die einzigen Dinge, die ich nicht habe, sind die großen Jungs wie ArcGis (obwohl ich vielleicht irgendwo eine alte Karteninfo herumliegen habe)


Der Datensatz, den ich erstellen möchte, soll ein GIS-Buch begleiten, das ich gerade schreibe und das sich an .NET-Programmierer richtet, die GIS-Anwendungen mit .NET schreiben möchten


Nachdem Sie die folgenden Vorschläge ausprobiert haben, war die Lösung von "Paul Ramseys" die beste.

Ich habe jetzt eine schöne vereinfachte Counties & Boroughs-Datei, die einfach genug für mein Buch ist, aber komplex genug, um einige interessante georäumliche SQL-Funktionen zu demonstrieren.

Auch wenn die Lösung von Paul letztendlich die richtige für mich war, habe ich mich auch auf die anderen Antworten gestützt, um beispielsweise die Polygon-Map zu vereinfachen und die Komplexität weiter zu verringern.

Auf etwas, das ich dabei beobachtet habe, obwohl ST_Collect in der Tat schneller als ST_Union ist, war es auch dasjenige, das hauptsächlich für gebrochene Geometrien verantwortlich ist. Ich vermute, die Geschwindigkeitserhöhung geht zu Lasten einer geringeren Genauigkeit der Kernfunktion.

shawty
quelle
Dieser Vorgang wird als "Auflösen" bezeichnet. Ich habe keine Erfahrung mit PostGIS, aber ich glaube, Sie können den Befehl ST_Union verwenden, um die Überblendung durchzuführen.
dmahr
Hallo dmahr, danke für die Klarstellung, war nicht sicher, wie es hieß, aber wenn du meine Frage liest, wirst du sehen, dass ich das schon versucht habe :-)
shawty
Ups, sorry ... hab das nicht gesehen. Haben Sie die select-Anweisung ohne das astext(multi())Teil ausprobiert ? Ich gehe nur davon aus, was ich in anderen PostGIS-Auflösungsbeispielen sehe.
dmahr
Noch nicht, werde das jetzt versuchen. Tks. Hast du einen Link für Auflösungsbeispiele?
Shawty
Bitte für Express bearbeiten, ob Sie "den einzelnen Außenring" wollen oder nicht. (siehe meine Antwort)
Peter Krauss

Antworten:

43

ST_Union würde funktionieren, aber Ihre Leitung ist mit ziemlicher Sicherheit nicht sauber. Die Grenzen Ihrer kleinen Dinger mögen sich also nicht alle perfekt. Sie können sie vorsichtig an einem Raster ausrichten, um die Wahrscheinlichkeit zu erhöhen, dass Scheitelpunkte ausgerichtet sind, aber ich wette, dass Sie noch einige Fälle haben, die nicht funktionieren. Entweder liegen sie außerhalb der Toleranz, oder es gibt Orte, an denen die Scheitelpunkte nicht gepaart sind, sodass auf der einen Seite eine Linie und auf der anderen Seite ein Scheitelpunkt vorhanden ist.

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

Wenn Sie mit PostGIS 2.0 arbeiten und eine Topologiestruktur mit Toleranz erstellen, können Sie mit etwas Glück die gesuchte Antwort finden.

Paul Ramsey
quelle
Guter Hinweis für die Geometriekorrektur, aber zu "... einem großen Polygon aus dem einzelnen Außenring, der alle Polys enthält ..."?
Peter Krauss
Ich wusste nichts über 'SnapTo' Ich werde es versuchen :-) Tks. Leider noch nicht mit PG 2, aber ein Upgrade ist in Vorbereitung.
Shawty
Nicht sicher, ob Ihre Syntax korrekt ist. Per postgis.net/docs/ST_Union.html , gibt es keine Unterschrift , die eine Zahl in dem 2. Parameter akzeptiert.
Aren Cambre
Du hast recht, die Klammer war am falschen Ort. Bearbeitet
Paul Ramsey
Gibt es ein MySQL-Äquivalent dazu? Ich bekomme immer Incorrect parameter count in the call to native function 'ST_Union'und ich weiß nicht, ob es eine MySQL-Einschränkung ist.
Jayen
7

Sie sagen, Sie müssen "... ein großes Polygon aus dem einzigen äußeren Ring bilden, der alle Polys enthält ...". Der ST_ExteriorRing macht das,

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

Sie können ST_Union () wie vorgeschlagen verwenden oder mit ST_Collection () testen.


HINWEISE: Um kleine Abweichungen oder "gebrochene Geometrien" zu vermeiden, können Sie st_convexhull und / oder ST_Simplify für jedes Geom verwenden.

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

und überprüfe deine Geometrien,

SELECT * FROM (
   SELECT gid, ST_IsValid(geom) as valid, ST_IsSimple(geom) as simple 
   FROM GEOMTABLE) AS t  
WHERE NOT(valid AND simple); 
Peter Krauss
quelle
Entschuldigen Sie die Verwirrung: Was ich mit meiner Beschreibung meinte, war ein größeres Polygon, das aus den kleineren Polygonen erstellt wurde. Ich erkenne, dass je nach Kontext 'Außenring' für verschiedene Leute unterschiedliche Bedeutungen haben kann Begrenzung vorhanden um jede Polygongruppe.
Shawty
7

Die ST_Collect- Funktion ist eine "Aggregat" -Funktion in der Terminologie von PostgreSQL

" SELECT ST_Collect(GEOM) FROM GEOMTABLE GROUP BY ATTRCOLUMN" gibt eine separate GEOMETRYCOLLECTION für jeden einzelnen Wert von ATTRCOLUM zurück

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

Hinweis: ST_Collect ist viel schneller als ST_Union

Mapperz
quelle
3
Ich habe das ausprobiert und etwas andere Ergebnisse erzielt. Aber ist eine Geometriesammlung das, was ich brauche? Ich versuche im Wesentlichen, ein großes Polygon zu erstellen, optional mit Löchern (speziell in Derbyshire und Nottinghamshire, wo beide, Derby und Nottingham, separate Bezirke in der Mitte bilden. Ich habe jedoch den Geschwindigkeitsunterschied beobachtet, das ist kewl.
shawty
2

Ich gehe von Ihrer Frage aus, dass Sie das Boundary-Line-Produkt von Ordnance Survey verwenden. Wenn dies der Fall ist, enthält es bereits einen Datensatz auf Kreisebene, sodass Sie nicht versuchen müssen, ihn selbst aus Pfarrgebieten auf niedrigerer Ebene zu generieren.

Wenn Sie Boundary-Line nicht verwenden, empfehle ich, dies zu tun, da es unter der OS OpenData-Lizenz kostenlos ist und eine County-Ebene als Shape-Datei hat, die Sie direkt in PostGIS laden können.

CHenderson
quelle
2
Wie wäre es, wenn Sie einen Link für diejenigen bereitstellen, die ihn nicht kennen? Vielen Dank.
Jonatr
1
Hallo CHEnderson, Sie haben in der Tat recht. Ja, ich verwende den Grenzschichtdatensatz von OS Opendata. Leider sind die Bezirksgrenzen nicht vollständig. Die eigentliche Formdatei des Bezirks enthält nur diejenigen, die als Bezirke bezeichnet werden. Die Londoner Bezirke enthalten die umliegenden Gebiete In London und in anderen Dateien befinden sich Teile, von denen einige niedriger und kleiner sind als die anderen. Die einzige Datei, die den gesamten Umriss des Vereinigten Königreichs enthält und anschließend die Möglichkeit bietet, alle Landkreise und Gemeindegrenzen auf einer Ebene zu extrahieren, ist die Ebene der Pfarreien. Deshalb versuche ich dies.
Shawty
Für diejenigen, die interessiert sind, können Sie die Bezirksgrenzen und mehr hier herunterladen: ordnancesurvey.co.uk/oswebsite/products/os-opendata.html
shawty