Trova vertici duplicati nella riga della geometria di SQL Server (ArcSDE)


10

Ho una linea in una featureclass polilinea ZM che ha una geometria non valida. Il mio sospetto è che la linea si raddoppi su se stessa da qualche parte, che ho trovato che a SQL Server non piace. Qualcuno sa di un metodo o query SQL veloce che potrebbe aiutarmi a identificare i punti negativi sospetti che stanno aumentando la mia geometria? La rappresentazione della stringa è simile alla seguente:

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

Inoltre, mi chiedo se potrei usare un'espressione regolare e guardare avanti e / o guardare dietro per trovare numeri duplicati ??

Risposte:


5

Ecco un modo con Python. Prendi il binario di linestring come stringa dal database:

select shape.ToString() from table_in_sde

quindi prendilo e inseriscilo in una variabile in Python, usa un po 'di regex, l'elenco e la bontà del dizionario per trovare i duplicati (a dire il vero, ho cercato su Google di trovare i contenuti del dizionario):

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

Il terzo elemento del dizionario è irrilevante (sono i valori Z e possono essere presenti più volte). I primi due elementi sono valori Y duplicati. Chiave è la coordinata, valore è il conteggio di quante volte appare nella stringa.


3

Prima di percorrere la via regex, vorrei iniziare con STIsValid () di SQL Server in combinazione con MakeValid () . Se vuoi dare un'occhiata al lato SDE, usa sdelayer -o feature_info -r non valido .


Il problema con MakeValid () è che i valori Z amd M non sono riportati nei calcoli, quindi l'esecuzione di MakeValid () su una stringa lineare ZM comporta una multistringa senza valori Z am M e devo avere i miei valori ZM.
Chad Cooper,

Ah, non ne ero a conoscenza. STIsValid () sta segnalando le tue geometrie errate?
Derek Swingley,

Sì, STIsValid () fa flag non è valido.
Chad Cooper,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.