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.