Verfeinern Sie die gute Antwort von @ Pablo mit Definitionen (unten) und fügen Sie für jede Methode eine Checkliste hinzu, um deren Verwendung einzuschränken. Definitionen:
Block Schicht eine SQL - Tabelle mit Polygonen ist , die darstellen , Stadtblocks Grenzen, die ohne oder Gehwege , aber private Konservieren (siehe Front-1 ) oder nicht-adressierbar Gassen (siehe Front-2 ) in den Block.
Lot Schicht ist eine SQL - Tabelle mit Polygonen darstellen Grundstücke Grenzen.
Straßenschicht ist eine SQL - Tabelle mit Linien , die Straßen ... Oder in einem „Fluss Land“ auch Flüsse (und eine Eisenbahn kann eine „Front“ sein?).
Front-1 : das @ Pablos Methoden sind über ein allgemeines Konzept der Front , wo einige viel mehr als „eine Front über eine Straße“, weil an der Ecke sind (zwei oder mehr Front-Segmente über alle seine umliegenden Straßen).
Front-2 : "Front" bezieht sich auf die Straße, die in der offiziellen Adresse (oder Korrespondenzadresse) des Loses angegeben ist. Sie haben alle Lose (auch an der Ecke) nur ein Front-Street-Segment. PS: Wenn Ihr Adressensystem und Ihre Blockschicht viele "horizontale Eigentumswohnungen " und deren Eigentumswohnungsadressen akzeptieren , müssen die "privaten Straßen" wie gewohnt angezeigt werden .
Die Frageillustration von @ ChristianAbreu zeigt das Front-2- Konzept (!) , Nicht das allgemeine.
Technischer Hinweis: Sie können Python mit PostGIS oder einem anderen OGC-kompatiblen Tool (für räumliches SQL) verbinden, um die Checklisten formal auszudrücken.
Checkliste für Methode 1 - Seite eines Polygons, die kein anderes Polygon berührt
Diese Methode hat einen topologischen Ansatz und gilt nur für Blöcke, bei denen alle Losbereiche den Blockbereich bilden. Um diese Methode verwenden zu können, benötigen Sie eine Blockebene .
Formell ausdrücken: Überprüfen Sie, ob blkarea~=sum_lotarea
für jeden Block,
SELECT ST_Area(geom) INTO blkarea FROM block WHERE gid=each1;
SELECT SUM(ST_Area(geom)) INTO sum_lotarea FROM lot WHERE gid_block=each1;
Oder wenn die Goemetries nicht genau sind oder wenn die Blöcke mit Gehwegen versehen sind, verwenden Sie das geringste w, um sicherzustellen, ST_Buffer(block.geom,-w)
dass ST_Within(lot.geom lot,ST_Buffer(block.geom,-w))
alle Lose vorhanden sind.
HINWEIS: Überprüfen Sie auch
Wenn sich alle Lose innerhalb eines Blocks befinden, ST_Within(lot.geom,block.geom)
für alle Lose und zugehörigen Blöcke.
Wenn für alle nicht disjunkten Lose keine überlappenden Bereiche vorhanden sind. not(ST_Overlaps(a,b))
oder dieser Schnittbereich hat keine Bedeutung (das heißt 2*ST_Area(ST_Intersection(a,b))/(ST_Area(a)+ST_Area(b))<0.01
).
Checkliste für Methode 2 - die Seite des Polygons, die einer Straße am nächsten liegt
Diese Methode hat einen geometrischen Ansatz, der auf einem minimalen euklidischen Abstand basiert .
Überprüfen Sie, ob die Straßenschicht nur "öffentliche Straßen" hat , da Sie "öffentliche Straßen" (die die offizielle Adresse eines Grundstücks ausdrücken können) von "Gassen" (können sich innerhalb des Grundstücks oder eines "Eigentumswohnungsblocks" trennen müssen ").
Überprüfen Sie dann visuell, ob alle "visuellen Blöcke" von Straßen umgeben sind. Wenn Ihre Straßenebene unvollständig ist, ist die Methode für diese Blöcke nicht gültig.
Schlussfolgerungen: Regeln für die Auswahl von Methoden
Für die Front-1- Definition:
A) Wenn Sie gute Straßendaten haben, verwenden Sie Methode 2 ;
B) Wenn Sie eine Blockschicht und eine konsistente Chargenschicht haben, verwenden Sie Methode 1
C) Wenn Sie keine guten Daten haben, teilen Sie Ihre Geodaten in Teile auf, in denen Sie die eine oder andere Methode anwenden können. PS: Auch ohne die Blockschicht können Sie benachbarte Grundstücke oder durch eine gute Antwort auf diese Frage verbinden .
Für die Front-2- Definition: Sie benötigen gute Straßendaten, da für die Front-2- Definition der Straßenname (der Losadresse) erforderlich ist. Verwenden Sie Methode 2 und löschen Sie vordere Segmente, die nicht denselben Straßennamen wie die Losadresse haben.