Знайдіть дублікати вершин у лінії геометрії SQL Server (ArcSDE)


10

У мене є рядок у класові поліліній ZM, який має неправильну геометрію. Я підозрюю, що лінія десь подвоюється назад, що мені здається, що SQL Server не любить. Хтось знає про швидкий метод SQL або запит, який міг би допомогти мені виявити підозрювані погані моменти, які піднімають мою геометрію? Представлення рядків виглядає приблизно так:

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

Також мені цікаво, чи можу я використати регулярний вираз і погляд вперед та / або озирнутися назад, щоб знайти дублюючі числа ??

Відповіді:


5

Ось один спосіб із Python. Отримайте рядок з бінарних рядків як рядок із бази даних:

select shape.ToString() from table_in_sde

потім візьміть це і поставте його в змінну в python, використовуйте деякий регекс, список і користь словника, щоб знайти дупси (якщо чесно, я Гугл, щоб знайти дублікат словника):

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

Третій елемент словника не має значення (це значення Z, і вони можуть бути присутніми в кілька разів). Перші два елементи - це повторювані значення Y. Ключ - координата, значення - кількість підрахунків, скільки разів вона відображається в рядку.


3

Перш ніж сходити по маршруту регулярних виразів, я почав би з STIsValid () SQL Server у поєднанні з MakeValid () . Якщо ви хочете перевірити речі на стороні SDE, використовуйте sdelayer -o feature_info -r недійсний .


Проблема з MakeValid () полягає в тому, що значення Z amd M не переносяться в обчисленнях, тому запуск MakeValid () на рядку ZM призводить до отримання багаторядкової рядки без значень Z am M, і я повинен мати свої значення ZM.
Чад Купер

Ах, я цього не знав. Невже STIsValid () позначає ваші погані геометрії?
Дерек Свінглі

Так, прапор STIsValid () робить недійсним.
Чад Купер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.