Ich möchte die durchschnittliche Breite eines Polygons untersuchen, das die Straßenoberfläche darstellt. Ich habe auch die Straßenmittellinie als Vektor (der manchmal nicht genau in der Mitte ist). In diesem Beispiel ist die Straßenmittellinie rot und das Polygon blau:
Ein Brute-Force-Ansatz, den ich mir überlegt habe, besteht darin, die Linie in kleinen Schritten zu puffern, den Puffer mit einem Fischnetzgitter zu schneiden, das Straßenpolygon mit einem Fischnetzgitter zu schneiden, die Schnittfläche für beide Schnittmaße zu berechnen und dies bis zu tun der fehler ist klein. Dies ist jedoch eine grobe Herangehensweise, und ich frage mich, ob es eine elegantere Lösung gibt. Außerdem würde dies die Breite einer großen Straße und einer kleinen Straße verbergen.
Ich interessiere mich für eine Lösung, die ArcGIS 10, PostGIS 2.0 oder QGIS-Software verwendet. Ich habe diese Frage gesehen und Dan Pattersons Tool für ArcGIS10 heruntergeladen, konnte aber nicht berechnen, was ich damit möchte.
Ich habe gerade das Werkzeug " Minimale Begrenzungsgeometrie" in ArcGIS 10 entdeckt, mit dem ich die folgenden grünen Polygone erstellen kann:
Dies scheint eine gute Lösung für Straßen zu sein, die einem Raster folgen, aber ansonsten nicht funktionieren würden. Daher bin ich immer noch an anderen Vorschlägen interessiert.
Antworten:
Ein Teil des Problems besteht darin, eine geeignete Definition der "durchschnittlichen Breite" zu finden. Einige sind natürlich, unterscheiden sich aber zumindest geringfügig. Betrachten Sie der Einfachheit halber Definitionen, die auf einfach zu berechnenden Eigenschaften basieren (was beispielsweise diejenigen ausschließt, die auf der Transformation der Mittelachse oder auf Sequenzen von Puffern basieren).
Als Beispiel sei angenommen, dass die archetypische Intuition eines Polygons mit einer bestimmten "Breite" ein kleiner Puffer (etwa mit dem Radius r mit quadratischen Enden) um eine lange, ziemlich gerade Polylinie (etwa mit der Länge L ) ist. Wir denken an 2r = w als seine Breite. Somit:
Sein Umfang P ist ungefähr gleich 2L + 2w;
Seine Fläche A ist ungefähr gleich wL.
Die Breite w und Länge L können dann als Wurzeln des quadratischen x ^ 2 - (P / 2) x + A gewonnen werden; Insbesondere können wir schätzen
Wenn Sie sicher sind, dass das Polygon wirklich lang und dünn ist, können Sie als weitere Annäherung 2L + 2w nehmen, um 2L zu entsprechen, von wo aus
Der relative Fehler in dieser Approximation ist proportional zu w / L: Je dünner das Polygon ist, desto näher ist w / L an Null und desto besser wird die Approximation.
Dieser Ansatz ist nicht nur extrem einfach (man teile die Fläche durch den Umfang und multipliziere mit 2), bei beiden Formeln spielt es keine Rolle, wie das Polygon ausgerichtet ist oder wo es sich befindet (weil solche euklidischen Bewegungen weder die Fläche noch die Fläche ändern) Umfang).
Sie können eine dieser Formeln verwenden, um die durchschnittliche Breite für alle Polygone zu schätzen , die Straßensegmente darstellen. Der Fehler, den Sie bei der ursprünglichen Schätzung von w (mit der quadratischen Formel) machen, tritt auf, weil der Bereich A auch winzige Keile an jeder Biegung der ursprünglichen Polylinie enthält. Wenn die Summe der Biegewinkel t Bogenmaß ist (dies ist die absolute Gesamtkrümmung der Polylinie), dann wirklich
P = 2L + 2w + 2 Pi tw und
A = L w + Pi tw ^ 2.
Stecken Sie diese in die vorherige (quadratische Formel) Lösung und vereinfachen Sie. Wenn der Rauch verschwindet , ist der Beitrag des Krümmungsterms t verschwunden! Was ursprünglich wie eine Annäherung aussah, ist für nicht sich selbst schneidende Polylinienpuffer (mit quadratischen Enden) vollkommen genau. Für Polygone mit variabler Breite ist dies daher eine vernünftige Definition der durchschnittlichen Breite.
quelle
Hier zeige ich nur eine geringe Optimierung der @ whuber-Lösung und gebe die "Pufferbreite" an, da dies nützlich ist, um die Lösung eines allgemeineren Problems zu integrieren: Gibt es eine st_buffer-Umkehrfunktion, die eine Breitenschätzung zurückgibt?
Für dieses Problem der @celenius Frage nach Breiter Straße ,
sw
ist die Lösungwo
sw
ist die "durchschnittliche Breite",g1
die Mittellinie vong2
und die Straßeg2
ist ein POLYGON . Ich habe nur die mit PostGIS getestete OGC-Standardbibliothek verwendet und andere ernsthafte praktische Anwendungen mit derselben buffer_width-Funktion gelöst.DEMONSTRATION
A2
ist die Fläche vong2
,L1
die Länge der Mittellinie (g1
) vong2
.Angenommen , dass wir erzeugen kann
g2
durchg2=ST_Buffer(g1,w)
, und dasg1
ist eine gerade, sog2
ist ein Rechteck mit LängeL1
und Breite2*w
, undEs ist nicht die gleiche Formel von @whuber, da hier die
w
Hälfte derg2
Breite von rectangle ( ) angegeben ist. Es ist ein guter Schätzer, aber wie wir anhand der Tests (unten) sehen können, ist er nicht genau und die Funktion verwendet ihn als Anhaltspunkt, um dieg2
Fläche zu verkleinern und als endgültigen Schätzer.Hier werden keine Puffer mit "endcap = square" oder "endcap = round" ausgewertet, die eine Summe zu
A2
einer Fläche eines Punktpuffers mit derselben benötigenw
.LITERATUR: In einem ähnlichen Forum von 2005 erklärt W. Huber ähnliche und andere Lösungen.
PRÜFUNGEN UND GRÜNDE
Bei geraden Linien sind die Ergebnisse erwartungsgemäß genau. Bei anderen Geometrien können die Ergebnisse jedoch enttäuschend sein. Der Hauptgrund ist möglicherweise, dass das gesamte Modell für exakte Rechtecke oder für Geometrien bestimmt ist, die sich einem "Streifenrechteck" annähern lassen. Hier ein "Testkit" zur Überprüfung der Grenzen dieser Näherung (siehe
wfactor
Ergebnisse oben).ERGEBNISSE:
MIT RECHTECKEN (Mittellinie ist eine GERADE LINIE):
MIT ANDEREN GEOMETRIEN (Mittellinie gefaltet):
Über
btype
siehe ST_Buffer Führung , mit guten ilustratins und den Linienfolgen verwendet hier.SCHLUSSFOLGERUNGEN :
w_estim
ist immer besser alsw_near
;g2
Geometrien ist es in Ordnungwfactor
wfactor=~0.01
für 1% des Fehlers aufw_estim
. Verwenden Sie bis zu diesem Faktor einen anderen Schätzer.Vorsicht und Vorbeugung
Warum tritt der Schätzfehler auf? Wenn Sie verwenden
ST_Buffer(g,w)
, erwarten Sie vom "rechteckigen Streifenmodell", dass der neue Bereich, der durch den Puffer mit der Breite hinzugefügtw
wird, ungefährw*ST_Length(g)
oderw*ST_Perimeter(g)
... Wenn nicht, normalerweise durch Überlagerungen (siehe gefaltete Linien) oder durch "Stylen", wann die Schätzung des durchschnittlichenw
Fehlers . Dies ist die Hauptbotschaft der Tests.Überprüfen Sie das Verhalten der Puffergenerierung , um dieses Problem bei jedem Pufferkönig zu erkennen :
ERGEBNISSE:
quelle
Wenn Sie Ihre Polygondaten mit Ihren Mittelliniendaten verbinden können (entweder räumlich oder tabellarisch), addieren Sie einfach die Polygonflächen für jede Mittellinienausrichtung und dividieren Sie durch die Länge der Mittellinie.
quelle
Ich habe eine Formel für die durchschnittliche Breite eines Polygons entwickelt und in eine Python / ArcPy-Funktion eingefügt. Meine Formel leitet sich aus dem einfachsten Begriff der Durchschnittsbreite ab (erweitert ihn jedoch erheblich), den ich an anderer Stelle erörtert habe. Das heißt, der Durchmesser eines Kreises mit der gleichen Fläche wie Ihr Polygon. In der obigen Frage und in meinem Projekt interessierte mich jedoch mehr die Breite der engsten Achse. Außerdem interessierte mich die durchschnittliche Breite für möglicherweise komplexe, nicht konvexe Formen.
Meine Lösung war:
Das ist:
Die Funktion ist:
Hier ist eine exportierte Karte mit der durchschnittlichen Breite (und einigen anderen Geometrieattributen als Referenz) für eine Vielzahl von Formen unter Verwendung der Funktion von oben:
quelle
area / perimeter * 4
.Eine andere Lösung mit ungefährer Mittelachse:
Bei Polygonen, bei denen die ungefähre Mittelachse keine durchgehende Linie ist, ist das Ergebnis sicherlich falsch. Sie können sie also vor Schritt 1 überprüfen und zurückkehren
NULL
oder so.Hier ist ein Beispiel für die PostgreSQL-Funktion (Hinweis: Sie müssen die Erweiterungen postgis und postgis_sfcgal installieren ):
Nachteil:
Diese Lösung funktioniert nicht in Fällen, in denen das Polygon fast rechteckig ist und der Mensch seine Länge intuitiv definieren kann, die ungefähre Mittelachse jedoch nahe der Kante kleine Verzweigungen aufweist und der Algorithmus daher None zurückgibt.
Beispiel:
quelle