Je suis intéressé à examiner la largeur moyenne d'un polygone qui représente la surface de la route. J'ai également la ligne centrale de la route comme vecteur (qui parfois n'est pas exactement au centre). Dans cet exemple, l'axe de la route est en rouge et le polygone est en bleu:
Une approche de force brute à laquelle j'ai pensé consiste à tamponner la ligne par petits incréments, à intersecter le tampon avec un maillage en filet, à intersecter le polygone routier avec un maillage à mailles, à calculer la surface intersectée pour les deux mesures d'intersection et à continuer ainsi l'erreur est petite. C'est une approche rudimentaire cependant, et je me demande s'il existe une solution plus élégante. En outre, cela dissimulerait la largeur d’une grande route et d’une petite route.
Je suis intéressé par une solution utilisant les logiciels ArcGIS 10, PostGIS 2.0 ou QGIS. J'ai vu cette question et téléchargé l' outil de Dan Patterson pour ArcGIS10, mais je n'ai pas pu calculer ce que je veux avec.
Je viens de découvrir l' outil de géométrie de limitation minimale dans ArcGIS 10 qui me permet de produire les polygones verts suivants:
Cela semble être une bonne solution pour les routes qui suivent une grille, mais ne fonctionnerait pas autrement, alors je suis toujours intéressé par toute autre suggestion.
Réponses:
Une partie du problème consiste à trouver une définition appropriée de «largeur moyenne». Plusieurs sont naturels mais différeront, au moins légèrement. Pour plus de simplicité, considérons des définitions basées sur des propriétés faciles à calculer (ce qui exclut celles basées sur la transformation de l’axe médian ou sur des séquences de tampons, par exemple).
A titre d'exemple, considérons que l'intuition archétypale d'un polygone ayant une "largeur" définie est un petit tampon (disons de rayon r aux extrémités carrées) autour d'une polyligne longue et assez droite (disons de longueur L ). Nous pensons que 2r = w est sa largeur. Ainsi:
Son périmètre P est approximativement égal à 2L + 2w;
Sa surface A est approximativement égale à w L.
La largeur w et la longueur L peuvent alors être récupérées en tant que racines du quadratique x ^ 2 - (P / 2) x + A; en particulier, on peut estimer
Lorsque vous êtes certain que le polygone est vraiment long et maigre, vous pouvez prendre une autre approximation de 2L + 2w pour obtenir 2L.
L'erreur relative dans cette approximation est proportionnelle à w / L: plus le polygone est mince, plus w / L est proche de zéro et meilleure est l'approximation.
Non seulement cette approche est-elle extrêmement simple (il suffit de diviser l'aire par le périmètre et de la multiplier par 2), quelle que soit la formule choisie, l'orientation du polygone ou son emplacement ne sont pas gênants (car de tels mouvements euclidiens ne changent ni l'aire ni le périmètre).
Vous pouvez envisager d'utiliser l'une de ces formules pour estimer la largeur moyenne de tout polygone représentant des segments de rue. L'erreur que vous faites dans l'estimation initiale de w (avec la formule quadratique) provient du fait que la zone A comprend également de minuscules coins à chaque pli de la polyligne originale. Si la somme des angles de courbure est t radians (c’est la courbure totale absolue de la polyligne), alors
P = 2L + 2w + 2 Pi tw et
A = L w + Pi tw ^ 2.
Branchez-les dans la solution précédente (formule quadratique) et simplifiez-les. Lorsque la fumée se dissipe, la contribution du terme de courbure t a disparu! Ce qui ressemblait à l’origine à une approximation est parfaitement exact pour les tampons polylignes ne se croisant pas automatiquement (avec des extrémités carrées). Pour les polygones de largeur variable, il s'agit donc d'une définition raisonnable de la largeur moyenne.
la source
Ici, je montre peu d'optimisation à propos de la solution @whuber, et je parle de "largeur de tampon", car cela est utile pour intégrer la solution d'un problème plus général: existe-t-il une fonction inverse de st_buffer, qui renvoie une estimation de la largeur?
Pour ce problème, la question @celenius au sujet de la largeur de la rue ,
sw
la solution estoù
sw
est la "largeur moyenne",g1
la ligne centrale deg2
, et la rueg2
est un POLYGONE . J'ai utilisé uniquement la bibliothèque standard OGC, testée avec PostGIS , et résolu d'autres applications pratiques sérieuses avec la même fonction buffer_width.MANIFESTATION
A2
est l'aire deg2
,L1
la longueur de la ligne centrale (g1
) deg2
.Supposons que nous puissions générer
g2
parg2=ST_Buffer(g1,w)
, et qu’ilg1
s’agisse d’une droite, ainsi que d’g2
un rectangle de longueurL1
et de largeur2*w
, etCe n'est pas la même formule de @whuber, car voici
w
la moitié de lag2
largeur de rectangle ( ). C'est un bon estimateur, mais comme nous pouvons le constater par les tests (ci-dessous), ce n'est pas exact, et la fonction l'utilise comme indice, pour réduire lag2
surface, et comme estimateur final.Ici, nous n'évaluons pas les tampons avec "endcap = square" ou "endcap = round", qui nécessitent la somme
A2
d'une surface d'une mémoire tampon de points avec le mêmew
.RÉFÉRENCES: dans un forum similaire de 2005 , W. Huber explique des solutions similaires .
TESTS ET RAISONS
Pour les lignes droites, les résultats, comme prévu, sont exacts. Mais pour d'autres géométries, les résultats peuvent être décevants. La raison principale en est que, peut-être, tout le modèle est-il pour des rectangles exacts, ou pour des géométries pouvant être approchées à un "rectangle en bande". Voici un "kit de test" pour vérifier les limites de cette approximation (voir
wfactor
les résultats ci-dessus).RÉSULTATS:
AVEC RECTANGLES (la ligne centrale est une ligne droite):
AVEC AUTRES GEOMETRIES (ligne centrale pliée):
À propos,
btype
voir le guide ST_Buffer , avec les bons ilustratins et les LINESTRING utilisés ici.CONCLUSIONS :
w_estim
est toujours meilleur quew_near
;g2
géométries "presque rectangulaires" , c'est ok, toutwfactor
wfactor=~0.01
de 1% d'erreur surw_estim
. Jusqu'à ce facteur, utilisez un autre estimateur.Attention et prévention
Pourquoi l'erreur d'estimation se produit? Lorsque vous utilisez
ST_Buffer(g,w)
, prévu, par le « modèle de bande rectangulaire », que la nouvelle zone ajoutée par le tampon de la largeurw
est d' environw*ST_Length(g)
ouw*ST_Perimeter(g)
... Lorsqu'ils ne sont pas, en général par des superpositions (voir les lignes pliées) ou en « coiffant », est quand l'estimation de law
faute moyenne . C'est le message principal des tests.Pour détecter ce problème à n’importe quel roi de tampon , vérifiez le comportement de la génération de tampon:
RÉSULTATS:
la source
Si vous pouvez joindre vos données de polygone à vos données de trait d'axe (par des moyens spatiaux ou tabulaires), additionnez simplement les zones de polygone pour chaque alignement de trait d'axe et divisez-les par la longueur du trait d'axe.
la source
J'ai développé une formule pour la largeur moyenne d'un polygone et je l'ai insérée dans une fonction Python / ArcPy. Ma formule est dérivée de (mais étend substantiellement) la notion la plus simple de largeur moyenne dont j'ai déjà discuté ailleurs; c'est-à-dire le diamètre d'un cercle ayant la même surface que votre polygone. Cependant, dans la question ci-dessus et dans mon projet, je m'intéressais davantage à la largeur de l'axe le plus étroit. De plus, je m'intéressais à la largeur moyenne des formes potentiellement complexes non convexes.
Ma solution était:
C'est:
La fonction est:
Voici une carte exportée avec la largeur moyenne (et quelques autres attributs de géométrie à titre de référence) pour diverses formes à l'aide de la fonction précédente:
la source
area / perimeter * 4
.Une autre solution avec axe médian approximatif:
Le résultat sera sûrement faux pour les polygones où l’axe médian approximatif n’est pas une simple ligne continue. Vous pouvez donc le vérifier avant l’étape 1 et renvoyer
NULL
un résultat.Voici un exemple de fonction PostgreSQL (note: vous devez installer les extensions postgis et postgis_sfcgal ):
Désavantage:
Cette solution ne fonctionnera pas dans les cas où le polygone est presque rectangulaire et que l’être humain peut définir sa longueur de manière exhaustive, mais que l’axe médial approximatif a de petites branches proches du bord et que l’algorithme ne renvoie aucun.
Exemple:
la source