Was ist eine effiziente Methode zum Erkennen von Straßenkreuzungen auf einer Karte?

14

Für mein Projekt kann es sein, dass ich Karten aus einer beliebigen Quelle erhalte. Für den von mir erstellten C ++ - Algorithmus muss der Algorithmus unbedingt wissen, wo sich Straßenkreuzungen (Knoten, an denen sich mehr als zwei Straßensegmente treffen) befinden. Außerdem gibt es in vielen Karten, die ich bekomme, Straßen, die über- und unterschritten werden (dh Straßen sind nicht richtig verbunden). Eine Möglichkeit, das Problem zu beheben, besteht darin, das Straßennetz mit Autocad zu "säubern". Die Fragen, die ich habe, sind:

  1. Gibt es eine effiziente Möglichkeit (irgendeine Software, die das kann?), Meine Karte in einem GML-Format abzurufen, das Informationen zu Straßenkreuzungen in der Karte enthält? (Vielleicht haben Sie ein GML-Tag, das besagt, dass ein bestimmter Knoten eine Junction ist.)
  2. Gibt es eine andere Möglichkeit, das Straßennetz zu "säubern"?

Die Kollegen haben FME vorgeschlagen, aber dazu müssen Skripte geschrieben werden, und wir sind uns nicht sicher, ob das Skript flexibel genug ist, um alle Karten zu berücksichtigen. Die einzige andere Möglichkeit, Kreuzungen zu erkennen, ist die Verwendung von Brute Force, um herauszufinden, welche Straßensegmente gemeinsame Knoten haben. Würde ArcGIS helfen? (habe es nicht benutzt, aber davon gehört) Ich bin sicher, es sollte einen besseren Weg geben ...

Nav
quelle
2
Müssen sich kreuzende Straßen gefunden werden? Wie soll es mit entarteten Geometrien umgehen (Polylinien, bei denen alle Scheitelpunkte zusammenfallen und somit die Länge Null haben)? Wie soll es mit zusammenfallenden Linien umgehen, bei denen der Schnittpunkt ein lineares Segment und nicht nur ein Punkt ist?
Kirk Kuykendall
@Kirk: Ich bin ein bisschen schockiert über die Situationen, die Sie erwähnt haben. Ich bin neu in GIS und wusste nicht einmal, dass es solche Möglichkeiten gibt. 1.Selbstschnitt erfordert mehrere Segmente. Sofern es sich nicht um eine Überführung handelt, würde ich diese Kreuzungen als Kreuzungen betrachten. 2. Ich kann mir nicht einmal vorstellen, was entartete Geometrie ist, also weiß ich nicht, was ich antworten soll. 3.Koinzidierende Linien sollten als zwei getrennte Straßen behandelt werden, da ich davon ausgehe, dass sie auch im wirklichen Leben so sind.
Nav

Antworten:

9

Wenn Sie die Straßen in einer räumlichen Form haben, wie z. B. einem Shapefile, können Sie sie in PostGIS laden und diese mithilfe einer SQL-Abfrage automatisch finden. Ich habe das schon einmal gemacht - die SQL-Anweisung wurde entwickelt, um für jede Straße diejenigen zu finden, die sich geografisch schneiden, und für jede Kreuzung einen Knotenpunkt zu erstellen.

Ich werde versuchen, dies später zu bereinigen, aber hier ist der grundlegende Ablauf, den Sie nehmen können ...

for line in road_layer_lines:
    ilines = get_intersecting_objects(line)
    for iline in ilines:
        road_junctions.extend(get_intersection(line, iline))

Mit den ST_ * -Funktionen funktioniert dies in PostGIS

  • ST_Envelope : Erfasst den Begrenzungsrahmen einer gegebenen Geometrie - dies wird verwendet, um den Algorithmus zu beschleunigen. Man kann eine geografische Suche mit den Begrenzungsrahmen in einem schnellen, aber weniger genauen Durchlauf eingrenzen und dann die Ergebnisse mit den tatsächlichen Geometrien scannen.
  • ST_Intersects : Bestimmt, ob sich zwei Geometrien schneiden
  • ST_Intersection : Gibt den Schnittpunkt zweier Geometrien zurück

Das Folgende sind nur Schnipsel, da ich keine Zeit zum Beenden habe. Vielleicht kann jemand sie bearbeiten, bevor ich wieder hierher komme ...

SELECT id, the_geom FROM road_lines
SELECT roads.id FROM road_lines roads WHERE ST_Intersects(roads.the_geom, my_geom)
SELECT ST_Intersection(roads.the_geom, my_geom) FROM road_lines roads WHERE roads.id = my_id
dmsnell
quelle
Just sharing: Eine andere Datenbank, auf die ich gestoßen bin, ist diese: < oracle.com/technetwork/database/berkeleydb/overview/index.html >. Anscheinend sind die Abfragen sehr schnell, da sie als Bibliotheken zur Verfügung stehen, die in die Anwendung eingebettet werden können.
Nav
1
@ dmsnell- Könnten Sie vielleicht ein Beispiel für die Art der SQL-Abfrage angeben, mit der diese Aufgabe ausgeführt wird?
RyanKDalton-OffTheGridMaps
11

Mithilfe von Puffern können Sie Polylinien auf erstaunliche Weise analysieren. Dies ist normalerweise ineffizient - Puffer erzeugen viele zusätzliche Eckpunkte - aber (a) es ist eine Technik, die in vielen GIS (vektor- oder rasterbasiert) verfügbar ist, und (b) es kann manchmal Informationen erzeugen, die ansonsten schwer zu bekommen sind.

In diesem Fall hinterlässt das Puffern der Straße um einen kleinen Betrag und das anschließende Puffern des Negativs um den gleichen Betrag kleine "Inseln" um alle Kurven und um alle Kreuzungen. Dies ist leicht geometrisch zu beweisen.

Hier ist ein Beispiel für einen 10 m langen Polylinienpuffer (grau) und einen -10 m langen Puffer (hellrot) auf einer 650 m breiten Karte:

Abbildung 1

Schneide nun die ursprüngliche Polylinienebene mit diesen Inselpolygonen, füge die Segmente nach Inselkennung zusammen und zähle die Teile:

Figur 2

Die hellgelben Segmente bezeichnen die Stücke mit hoher Anzahl und die dunklen cyanfarbenen Segmente bezeichnen die Stücke mit niedriger Anzahl. Auf diese Weise haben wir (a) alle Biegungen und Kreuzungen (einschließlich Selbstkreuzungen) und Nahkreuzungen (siehe ganz links, wo sich die beiden Segmente nicht ganz treffen) gefunden und (b) die Biegungen von den Kreuzungen unterschieden. Wir können die Fast-Junctions finden, indem wir die Inseln auswählen, die zwei oder mehr verbundene Segmente enthalten: Die Biegungen enthalten nur verbundene Segmente.

Aufgrund der Puffersymmetrie sind die Schwerpunkte der Schnittinseln die Schnittpunkte.

Ein schöner Aspekt dieser Art der Analyse ist, dass es egal ist, wie die zugrunde liegende Polylinie dargestellt wird: Es kann sich um ein einzelnes Feature handeln, es kann sich um ein Feature für jedes Liniensegment handeln oder um etwas dazwischen.

whuber
quelle
6

Ja, das können Sie sicher mit FME. Es gibt viele "Transformatoren", die für die Bereinigung, Schnittmengen und Topologie zuständig sind. In diesem Fall würde ich den TopologyBuilder- Transformator ausprobieren .

Alle Skripte werden in einer grafischen Umgebung erstellt, daher ist dies sehr einfach.

Sie können jederzeit eine Testversion von www.safe.com erhalten

(Offenlegung: Mark Ireland, aka FME Evangelist, Safe Software Inc.)

Markieren Sie Irland
quelle
Ich unterstütze das. FME eignet sich hervorragend für dieses spezielle Problem, sowohl für die Umwandlung von AutoCAD in GML als auch für die topologische Bereinigung. Es kann in seiner Anwendung erstaunlich universell sein.
Blord-Castillo
-1

Arcgis Network Analyst, den Sie mit einer kostenlosen Testversion erhalten, erledigt dies in weniger als 10 Sekunden und mit nur wenigen Klicks.

Thad
quelle
-1

Der Vorgang kann in ArcGIS mit dem Netzwerkanalysten ausgeführt werden.

In ArcGIS gibt es auch eine andere Möglichkeit: Sie können die folgenden Schritte ausführen: "Arctoolbox" → "Datenverwaltungstools" → "Features" → "Feature-Stützpunkte zu Punkten". Dort können Sie tun, was Sie benötigen.

Ein Bett
quelle