Suchen Sie doppelte Scheitelpunkte in der SQL Server-Geometrielinie (ArcSDE).

10

Ich habe eine Linie in einer ZM-Polylinien-Feature-Class mit einer ungültigen Geometrie. Mein Verdacht ist, dass sich die Zeile irgendwo auf sich selbst verdoppelt, was SQL Server nicht gefällt. Kennt jemand eine schnelle SQL-Methode oder Abfrage, mit deren Hilfe ich die verdächtigen fehlerhaften Punkte identifizieren kann, die meine Geometrie aufbocken? Die Zeichenfolgendarstellung sieht folgendermaßen aus:

1835815.86 12887142.42 0 0, 1835816.72 12887142.68 170 170, 1835817.53 12887142.76 349.99 350, 1835817.52 12887142.76 559.99 560, 1835817.78 12887142.76 659.99 660, ....

Außerdem frage ich mich, ob ich einen regulären Ausdruck und einen Blick nach vorne und / oder nach hinten verwenden könnte, um doppelte Zahlen zu finden?

Chad Cooper
quelle

Antworten:

5

Hier ist eine Möglichkeit mit Python. Holen Sie sich die Linestring-Binärdatei als Zeichenfolge aus der Datenbank:

select shape.ToString() from table_in_sde

Nehmen Sie das und fügen Sie es in eine Variable in Python ein. Verwenden Sie Regex, Liste und Wörterbuchgüte, um die Dups zu finden (um ehrlich zu sein, habe ich gegoogelt, um das Wörterbuch-Dup-Zeug zu finden):

>>> import re
>>> s = 'LINESTRING (1835815.86 12887142.42 0 0, 1835816.72 12887142.68 170 170, 1835817.53 12887142.76 349.99 350, 1835817.52 12887142.76 559.99 560,....)'
>>> l = re.findall(r'(\d+.\d{2})\s',s)

>>> icount = {}
>>> for i in l:
...     icount[i] = icount.get(i,0) + 1

>>> for key, value in icount.iteritems():
...     if value > 1:
...             dups[key] = value
...
>>> dups
{'12887142.42': 2, '12887142.76': 3, '3081.28': 2}
>>>

Das dritte Wörterbuchelement ist irrelevant (es sind Z-Werte und sie können mehrmals vorhanden sein). Die ersten beiden Elemente sind doppelte Y-Werte. Schlüssel ist die Koordinate, Wert ist die Anzahl, wie oft sie in der Zeichenfolge erscheint.

Chad Cooper
quelle
3

Bevor ich die Regex-Route einschlage , beginne ich mit STIsValid () von SQL Server in Kombination mit MakeValid () . Wenn Sie Dinge auf der SDE-Seite überprüfen möchten, verwenden Sie sdelayer -o feature_info -r ungültig .

Derek Swingley
quelle
Das Problem mit MakeValid () ist, dass Z amd M-Werte nicht in Berechnungen ausgeführt werden. Wenn Sie also MakeValid () auf einem ZM-Linestring ausführen, wird ein Multilinestring ohne Z am M-Werte erstellt, und ich muss meine ZM-Werte haben.
Chad Cooper
Ah, das war mir nicht bewusst. Markiert STIsValid () Ihre schlechten Geometrien?
Derek Swingley
Ja, das STIsValid () -Flag-Flag ist ungültig.
Chad Cooper