Ich habe die folgende Schicht mit SRID 27700 in Postgis:
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.
astext(multi())
Teil ausprobiert ? Ich gehe nur davon aus, was ich in anderen PostGIS-Auflösungsbeispielen sehe.Antworten:
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.
Wenn Sie mit PostGIS 2.0 arbeiten und eine Topologiestruktur mit Toleranz erstellen, können Sie mit etwas Glück die gesuchte Antwort finden.
quelle
Incorrect parameter count in the call to native function 'ST_Union'
und ich weiß nicht, ob es eine MySQL-Einschränkung ist.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,
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.
und überprüfe deine Geometrien,
quelle
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ückhttp://postgis.net/docs/ST_Collect.html
Hinweis: ST_Collect ist viel schneller als ST_Union
quelle
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.
quelle