Найти дубликаты вершин в линии геометрии 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 invalid .

Дерек Суингли
источник
Проблема с MakeValid () заключается в том, что значения Z amd M не переносятся в вычислениях, поэтому запуск MakeValid () на строке строк ZM приводит к множеству строк без значений Z am M, и у меня должны быть значения ZM.
Чед Купер
Ах, я не знал об этом. STIsValid () помечает ваши плохие геометрии?
Дерек Суингли
Да, STIsValid () делает флаг недействительным.
Чед Купер