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

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.


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 .


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.