Encontre vértices duplicados na linha de geometria do SQL Server (ArcSDE)

10

Eu tenho uma linha em uma classe de característica de polilinha do ZM que possui uma geometria inválida. Minha suspeita é que a linha se dobra novamente em algum lugar, o que eu achei que o SQL Server não gosta. Alguém conhece um método SQL rápido ou consulta que poderia me ajudar a identificar os pontos negativos suspeitos que estão aumentando minha geometria? A representação da string é assim:

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

Além disso, eu estou querendo saber se eu poderia usar uma expressão regular e olhar para frente e / ou olhar para trás para encontrar números duplicados?

Chad Cooper
fonte

Respostas:

5

Aqui está uma maneira com o Python. Obtenha o binário de cadeia de linhas como string fora do banco de dados:

select shape.ToString() from table_in_sde

então pegue isso e coloque-o em uma variável em python, use alguma regex, lista e bondade de dicionário para encontrar os dups (para ser sincero, pesquisei no Google para encontrar as coisas de dup do dicionário):

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

O terceiro item do dicionário é irrelevante (são valores Z e eles podem estar presentes várias vezes). Os dois primeiros itens são valores Y duplicados. Key é a coordenada, value é a contagem de quantas vezes aparece na string.

Chad Cooper
fonte
3

Antes de seguir a rota regex, eu começaria com o STIsValid () do SQL Server em combinação com MakeValid () . Se você quiser verificar as coisas no lado da SDE, use sdelayer -o feature_info -r invalid .

Derek Swingley
fonte
O problema com MakeValid () é que os valores de Z amd M não são realizados nos cálculos; portanto, a execução de MakeValid () em uma cadeia de linhas do ZM resulta em uma cadeia de linhas múltiplas sem valores de ZamM e eu tenho que ter meus valores de ZM.
Chad Cooper
Ah, eu não estava ciente disso. STIsValid () está sinalizando suas geometrias ruins?
Drek Swingley 27/10/10
Sim, o sinalizador STIsValid () é tão inválido.
Chad Cooper