Znajdź zduplikowane wierzchołki w linii geometrii programu SQL Server (ArcSDE)

10

Mam linię w klasie cech polilinii ZM, która ma nieprawidłową geometrię. Podejrzewam, że linia gdzieś się podwaja, co, jak zauważyłem, SQL Server nie lubi. Czy ktoś wie o szybkiej metodzie SQL lub zapytaniu, które mogą pomóc mi zidentyfikować podejrzane złe punkty, które podnoszą moją geometrię? Reprezentacja ciągu wygląda następująco:

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, ....

Zastanawiam się również, czy mógłbym użyć wyrażenia regularnego i spojrzeć w przyszłość i / lub spojrzeć w tył, aby znaleźć duplikaty liczb?

Chad Cooper
źródło

Odpowiedzi:

5

Oto jeden sposób z Pythonem. Pobierz binarny znak liniowy jako ciąg znaków z bazy danych:

select shape.ToString() from table_in_sde

następnie weź to i umieść w zmiennej w Pythonie, użyj wyrażeń regularnych, listy i słownika, aby znaleźć dups (szczerze mówiąc, I Googled, aby znaleźć słownik dup rzeczy):

>>> 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}
>>>

Trzeci element słownika jest nieistotny (są to wartości Z i mogą występować wiele razy). Pierwsze dwa elementy są zduplikowanymi wartościami Y. Klucz jest współrzędną, wartość jest liczbą, ile razy pojawia się w ciągu.

Chad Cooper
źródło
3

Przed zejściem do wyrażenia regularnego zacznę od SQL Server STIsValid () w połączeniu z MakeValid () . Jeśli chcesz to sprawdzić po stronie SDE, użyj sdelayer -o feature_info -r niepoprawny .

Derek Swingley
źródło
Problem z MakeValid () polega na tym, że wartości Z amd M nie są przenoszone w obliczeniach, więc uruchomienie MakeValid () na łączeniu liniowym ZM powoduje multilinestring bez wartości Z am M i muszę mieć moje wartości ZM.
Chad Cooper
Ach, nie byłem tego świadomy. Czy STIsValid () oznacza twoje złe geometrie?
Derek Swingley
Tak, STIsValid () robi flagę jest tak nieprawidłowa.
Chad Cooper