Rechercher des sommets en double dans la ligne de géométrie SQL Server (ArcSDE)

10

J'ai une ligne dans une classe de traits de polyligne ZM qui a une géométrie non valide. Je soupçonne que la ligne se replie quelque part sur elle-même, ce que j'ai trouvé que SQL Server n'aime pas. Quelqu'un connaît une méthode ou une requête SQL rapide qui pourrait m'aider à identifier les mauvais points suspects qui sont en train de détourner ma géométrie? La représentation sous forme de chaîne ressemble à ceci:

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

De plus, je me demande si je pourrais utiliser une expression régulière et regarder en avant et / ou en arrière pour trouver des numéros en double ??

Chad Cooper
la source

Réponses:

5

Voici une façon avec Python. Obtenez le binaire linestring sous forme de chaîne de la base de données:

select shape.ToString() from table_in_sde

puis prenez cela et mettez-le dans une variable en python, utilisez des expressions rationnelles, des listes et des dictionnaires pour trouver les doublons (pour être honnête, j'ai cherché sur Google pour trouver les trucs de dup du dictionnaire):

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

Le troisième élément du dictionnaire n'est pas pertinent (ce sont les valeurs Z et elles peuvent être présentes plusieurs fois). Les deux premiers éléments sont des valeurs Y en double. La clé est la coordonnée, la valeur est le nombre de fois où elle apparaît dans la chaîne.

Chad Cooper
la source
3

Avant de descendre la route regex, je commencerais par STIsValid () de SQL Server en combinaison avec MakeValid () . Si vous voulez vérifier les choses du côté SDE, utilisez sdelayer -o feature_info -r invalid .

Derek Swingley
la source
Le problème avec MakeValid () est que les valeurs Z amd M ne sont pas prises en compte dans les calculs, donc exécuter MakeValid () sur une ligne ZM entraîne une ligne multiligne sans valeurs Z am M, et je dois avoir mes valeurs ZM.
Chad Cooper
Ah, je n'étais pas au courant de ça. STIsValid () signale-t-il vos mauvaises géométries?
Derek Swingley
Oui, STIsValid () ne marque pas est aussi invalide.
Chad Cooper