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?

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.


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 .


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.