Wie würde ich mehrere benachbarte Polygone verallgemeinern?

8

Wenn Sie eine Tabelle mit einem Feld Geometrietyp (oder Geografie) haben, können Sie die Funktion Reduce() aufrufen, um die Anzahl der Scheitelpunkte zu reduzieren. Funktioniert sehr gut. Wenn jedoch mehrere Polygone benachbart sind (sie teilen Teile ihrer Grenzen), tun dies die reduzierten Polygone nicht notwendigerweise.

Beispiel

Der SQL-Stapel:

%Vor%

Dies gibt zwei Sätze von Polygonen zurück. Zuerst das unreduzierte Set:

Dann die reduzierte Menge:

Diese Formen sind viel einfacher und sie haben die grobe Form korrekt, aber was ich möchte, ist, dass die Randteile noch geteilt werden. Also müssen sie in gewisser Weise zusammen reduziert werden.

Ich denke, du musst sie zuerst in Polylinien aufteilen (von Kante zu Kante), dann die Linien reduzieren und sie dann wieder zu Polygonen zusammensetzen. Ich habe jedoch keine Ahnung, wie man das in T-SQL macht.

Irgendwelche Ideen?

Bearbeiten: Ich habe die Antwort von alphadaogg angenommen. Beide aktuellen Antworten waren nicht ganz überzeugend für mich, aber alphadogg hat sich sehr bemüht und ich freue mich über jeden Gedankenaustausch. Also geht das Kopfgeld zu ihm.

Ich werde später mit einer Selbstantwort nachgehen, wenn ich eine befriedigende Methode finde.

Follow-up : Ich habe eine E-Mail mit Isaac Kunen, dem Programmmanager des SqlServer Geo-Teams, gesendet. Seine hilfreiche Antwort ist unten:

  

Ihr Problem ist nicht selten, aber   Es ist nicht etwas, was wir direkt tun   Unterstützung: Es ist eine Operation, die   erfordert Kenntnisse über die Topologie von   deine Figuren, und wir haben es nicht   so etwas ist eingebaut.   Im Wesentlichen möchten Sie nicht speichern   separate Polygone für jeden   Gegend. Eher willst du   Speichern Sie Kurven, die Teile von darstellen   Grenzen, und diese Grenzen wiederverwenden   für mehrere Polygone. Wenn du   Verallgemeinern, verallgemeinern Sie das Gemeinsame   Grenze und alle abhängigen Polygone   sind betroffen.

     

Du könntest das selbst bauen --- als   Plakate im Faden, den du zitierst   Hinweis --- aber es kann eine echte Anstrengung sein, zu tun   so.

     

Ich kenne die Software von Drittanbietern nicht   du benutzt, aber das ist das andere   Möglichkeit. Wenn du nicht willst   vollwertiges GIS, könnten Sie ein   Paket wie die FME von Safe   Software ( Ссылка ). Das   FME macht keinen allgemeinen Zweck   Topologie, aber ich glaube, es hat genug   Funktionalität, um das zu tun, was du bist   Auf der Suche nach. Sehen:    Ссылка .

     

Ich hoffe, das hilft.

     

Prost,

     

-Isaac

    
Teun D 12.02.2009, 14:40
quelle

4 Antworten

3

Ich bin mir nicht sicher, wie Sie die "geteilten" LineStrings von Ihren Shapes bekommen würden. Zweitens, sobald Sie eine "Teilmenge" der Form reduzieren, da sich Ihre Endpunkte möglicherweise vom Original entfernen und Sie nach der Reduktion nicht mehr übereinstimmen können.

Der Kern dessen, was ich tun würde, ist im Grunde boolesche Operationen, um mit den reduzierten Formen zu spielen.

Machen Sie zuerst, was Sie tun, nämlich eine temporäre Tabelle mit reduzierten Formen (namens #ReducedShapes ).

Dann würde ich eine zweite temporäre Tabelle erstellen und die Überlappungsbereiche (mit STIntersection ) zwischen allen Formen finden. In dieser Tabelle hätte ich grundsätzlich die Spalten naam1 , naam2 und intsec , von denen die letzte vom Typ shape ist. Etwas wie (ungetestet):

%Vor%

Dadurch erhalten Sie eine Liste der Überlappungen von Formenpaaren. Tatsächlich haben Sie zwei Reihen für jede Überlappung. Wenn sich beispielsweise A und B überschneiden, haben Sie und. Ich würde einen Durchlauf machen und einen der zwei für jedes Vorkommen löschen.

Schließlich würde ich für jede Überlappung den Schnittpunkt von der Tabelle STDifference ( #ReducedShapes ) von nur einer der beiden Regionen im Paar subtrahieren. Stellen Sie sich vor Sie haben zwei Quadrate A und B, halb überlappend. Die Operation würde beinhalten A.STDifference (B) bedeutet, dass Sie alle von B und die Hälfte von A behalten. Ich würde die geänderten Formen in eine dritte Tabelle einfügen (sagen wir #ModifiedShapes ).

Zwei Probleme: a) Wie du an deinen "orangefarbenen" und "blauen" Formen erkennen kannst, haben sie sich nicht in ähnlicher Weise verringert, also bekommst du eine von zwei möglichen Reduzierungen, abhängig davon, wie du damit umgehst, wer "gewinnt". b) Eine kompliziertere Form des Problems besteht darin, dass Sie je nach Komplexität der Ausgangsformen Überlappungen zwischen drei oder mehr Regionen erhalten können. Sie müssen Ihren eigenen Weg bestimmen, um zu bestimmen, welche Form in dieser Kreuzung "gewinnt", basierend auf Ihren speziellen Bedürfnissen. Es ist nicht klar, ob es Einschränkungen gibt. Könnte so einfach sein wie willkürlich einen Gewinner durch die Bestellung auswählen, oder komplizierter, da die Genauigkeit wichtig ist.

Das obige Konzept behandelt das Problem der Lücken leider nicht. Dieses ist ein wenig komplizierter und ich bin nicht 100% sicher, wie man es löst. Wenn Sie jedoch eine dritte Tabelle erstellen, die alle modifizierten Formen STDifference von allen ursprünglichen Formen in #ModifiedShapes subtrahiert (was wiederum auf Überlappung prüft, bevor tatsächlich subtrahiert wird), bleibt Ihnen nichts anderes übrig der Rest formt sich in den Lücken. Sie möchten die angrenzenden Formen aggregieren und eine "gewinnende Farbe" zuweisen, die möglicherweise wieder mit der entsprechenden Form zusammengeführt wird.

Diese Antwort ist lang und ich werde es so lassen. Ich kann den falschen Baum bellen. Aufgrund Ihrer Rückmeldungen / Fragen würde ich den Beitrag ergänzen.

    
alphadogg 17.02.2009, 22:30
quelle
2

Wow, das ist eine ziemlich coole Reihe von Funktionen.

Wenn wir uns einige andere verfügbare Methoden ansehen, hier ein paar Ideen, die Ihnen einfallen:

Verwenden Sie bei den nicht reduzierten Formen .STIntersects (gibt einen booleschen Wert zurück) und .STIntersection (gibt eine Form zurück), um herauszufinden, ob und wo sich zwei Formen schneiden.

Für zwei benachbarte Kartenregionen würde ich annehmen, dass .STIntersection das Liniensegment zurückgeben sollte, das an beide angrenzt.

Dann können Sie diese Liniensegmente reduzieren und die reduzierten Formen wieder zusammenbauen.

    
BradC 17.02.2009 14:52
quelle
0

Isaac hat Recht, dass Sie die Features in Linien reduzieren und sie als gemeinsame Grenzen verwenden können.

Aber die Software, die er erwähnt - FME - hat einen Transformator namens "Generalizer", der sie vereinfacht, wie Sie es wünschen, und trotzdem als Polygone erhalten. Die zu verwendende Option heißt "Shared Boundaries beibehalten". Sie können FME von [hier] [1] herunterladen und eine 14-tägige Evaluierungslizenz anfordern, um es auszuprobieren.

    
Mark I 05.05.2010 22:07
quelle
0

Dies ist nicht streng genommen eine Antwort auf Ihre Frage, aber wenn Ihr oberstes Ziel darin besteht, Karten im Browser zu rendern, dann sollten Sie sich Mike Topocks Projekt TopoJSON ansehen.

TopoJSON ist wie GeoJSON ein Javascript-freundliches Dateiformat. Im Gegensatz zu GeoJSON enthält TopoJSON nur die Topologie, so dass gemeinsame Grenzen nur einmal dargestellt werden. Dies führt zu (a) kompakteren Daten und (b) nahtloser Vereinfachung.

Hier gibt es eine großartige Einführung, einschließlich Live-Visualisierungen des Algorithmus, der zum Ableiten der Topologie verwendet wird: Ссылка

Das Projekt-Wiki ist hier: Ссылка

    
Herb Caudill 01.06.2014 21:46
quelle