Encuentre vértices duplicados en la línea de geometría de SQL Server (ArcSDE)

10

Tengo una línea en una clase de entidad de polilínea ZM que tiene una geometría no válida. Mi sospecha es que la línea se dobla sobre sí misma en algún lugar, lo que he encontrado que a SQL Server no le gusta. ¿Alguien sabe de un método o consulta rápida de SQL que pueda ayudarme a identificar los puntos negativos sospechosos que están elevando mi geometría? La representación de cadena se ve así:

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

Además, me pregunto si podría usar una expresión regular y mirar hacia adelante y / o mirar hacia atrás para encontrar números duplicados.

Chad Cooper
fuente

Respuestas:

5

Aquí hay una forma con Python. Obtenga el binario de cadena lineal como cadena de la base de datos:

select shape.ToString() from table_in_sde

luego tome eso y colóquelo en una variable en python, use algunas bondades de expresiones regulares, listas y diccionarios para encontrar los duplicados (para ser honesto, busqué en Google para encontrar el material duplicado del diccionario):

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

El tercer elemento del diccionario es irrelevante (son valores Z y pueden estar presentes varias veces). Los dos primeros elementos son valores Y duplicados. La clave es la coordenada, el valor es el recuento de cuántas veces aparece en la cadena.

Chad Cooper
fuente
3

Antes de seguir la ruta regex, comenzaría con STIsValid () de SQL Server en combinación con MakeValid () . Si desea verificar las cosas en el lado SDE, use sdelayer -o feature_info -r invalid .

Derek Swingley
fuente
El problema con MakeValid () es que los valores Z amd M no se llevan a cabo en los cálculos, por lo que ejecutar MakeValid () en una cadena lineal ZM da como resultado una multilínea sin valores Z am M, y tengo que tener mis valores ZM.
Chad Cooper
Ah, no estaba al tanto de eso. ¿STIsValid () marca sus geometrías incorrectas?
Derek Swingley
Sí, el indicador STIsValid () no es válido.
Chad Cooper