Suite

Calcul de toutes les distances de points uniques à plusieurs polygones

Calcul de toutes les distances de points uniques à plusieurs polygones


J'ai deux couches : une couche de points définissant les propriétés (95 objets) et une couche de polygones définissant les parcelles de terrain associées aux propriétés (211 objets). Chaque point se rapporte à un ou plusieurs polygones. Ce que je voudrais produire est un tableau des distances de chaque point à TOUS les polygones associés à ce point (bord le plus proche ou centroïde du polygone - l'un ou l'autre fera l'affaire). Le calcul de la distance la plus proche est relativement facile dans QGIS et ArcGIS, mais ces calculs omettent tous les polygones distants, du moins par les méthodes que j'ai utilisées. Idéalement, je voudrais une sortie de

ID_point | distance au polygone 1 | distance au polygone 2 | distance au polygone 3 | etc.

Tout pointeur dans ArcGIS 10 ou QGIS 2.2+ serait très utile.


Vous pouvez utiliser le Matrice de distance dans QGIS pour y parvenir. Vous devez d'abord convertir vos polygones en centre de gravité soit par Vecteur > Outils de géométrie > Centres de gravité des polygones ou via la version SAGA des centroïdes des polygones. La raison en est la Matrice de distance La fonction ne peut analyser qu'entre 2 couches de points. De plus, la sortie ressemblerait à ceci:

Point_1 | PolygonCentroid_1 | Distance Point_1 | PolygonCentroid_2 | Distance Point_1 | PolygonCentroid_3 | Distance Point_2 | PolygonCentroid_1 | Distance Point_2 | PolygonCentroid_2 | Distance

La sortie serait un fichier .csv afin que vous puissiez modifier manuellement la mise en page à l'aide d'un autre logiciel tel que Microsoft Excel.


C'est assez simple à réaliser en utilisant QGIS (je pense que n'importe quelle version fera l'affaire) et une instruction SQL très simple dans le gestionnaire de base de données. Mais pour cela, cela doit être dans une sorte de base de données spatiale (Postgis ou spatialite). Comme il est plus accessible à la plupart des gens, je suppose que j'utilise spatialite, mais les instructions SQL sont les mêmes pour Postgis.

  1. Créer une nouvelle base de données Spatialite ;
  2. Importez vos couches de points et de polygones dans la nouvelle base de données ;
  3. Ouvrez le plug-in du gestionnaire de base de données, sélectionnez la base de données et exécutez l'une des instructions SQL suivantes :

Distance de tous les points aux limites de tous les polygones

SELECT f.point_id, g.polygon_id, st_distance(g.geom, f.geom) AS distance FROM points_table AS f, polygons_table AS g

Distance de tous les points aux limites des polygones associés (en supposant qu'un champ commun existe)

SELECT f.point_id, g.polygon_id, st_distance(g.geom, f.geom) AS distance FROM points_table AS f JOIN polygons_table AS g ON (g.common_field = f.common_field)

Distance de tous les points aux centroïdes des polygones associés:

SELECT f.point_id, g.polygon_id, st_distance(f.geom, st_centroid(g.geom)) AS distance FROM points_table AS f JOIN polygons_table AS g ON (g.common_field = f.common_field)

Notez que vous pouvez ajouter n'importe quel champ de vos calques au résultat :

SELECT f.point_id, f.point_number, g.polygon_id, g.parcel_name, st_distance(f.geom, st_centroid(g.geom)) AS distance FROM points_table AS f JOIN polygons_table AS g ON (g.common_field = f.common_field)

Ou même tous les champs :

SELECT f.*, g.*, st_distance(f.geom, st_centroid(g.geom)) AS distance FROM points_table AS f JOIN polygons_table AS g ON (g.common_field = f.common_field)

L'outil Générer une table proche dans ArcGIS fera ce que vous voulez, mais il nécessite une licence avancée et le fera pour tout points/polygones - pas seulement ceux associés les uns aux autres. Cela signifie que pour chacun de vos 95 objets, vous obtiendrez la distance classée pour les 211 propriétés, soit 20 045 lignes dans le tableau. Vous devrez soit filtrer la table résultante, soit, comme le suggère Emil, automatiser la tâche pour créer des sélections basées sur l'association et ne l'exécuter que sur ces groupes.

En ce qui concerne le filtrage, oui, une jointure (suivie d'une requête de définition ou d'une sélection) est tout ce dont vous avez besoin. Le résultat de l'outil vous donne IN_FID et NEAR_FID. Selon la façon dont vous exécutez l'outil (propriétés près du point ou point près de la propriété), déterminez quel FID est lequel. Vous devez ensuite joindre vos tables de points et de propriétés (les deux) au résultat de l'outil en fonction du FID approprié.

Cela suppose que chacun de vos 211 enregistrements de propriété a un attribut qui indique à quel point ils appartiennent, car l'étape suivante consiste à sélectionner (ou à interroger la définition) tous les enregistrements dans la ou les tables jointes où deux champs d'un enregistrement doivent match - champ de nom de point = champ de nom de point associé à la propriété. Les cas où ils ne correspondent pas sont des polygones qui ne sont pas associés à ce point, vous ne vous souciez donc pas de leur distance par rapport à ce point.


Calculer la distance entre deux emplacements géographiques dans le serveur SQL

J'essaie de calculer la distance d'un point à un autre (polygone/multipolygone) à l'aide de la requête suivante dans SQL Server.

Les coordonnées suivantes sont au Royaume-Uni,

Les coordonnées de Polygon sont au Japon. D'une manière ou d'une autre, lorsque j'exécute la requête, la distance que j'obtiens est incorrecte.

Vous pouvez vérifier le résultat dans le violon db suivant,

Vous ne savez pas si je fais quelque chose de mal ?


2 réponses 2

Avez-vous essayé ?dist, la formule que vous avez indiquée est la distance euclidienne

Vous pouvez utiliser une auto-jointure pour obtenir toutes les combinaisons, puis appliquer votre formule de distance. Tout cela est facilement réalisable en utilisant le tidyverse (combinaison de packages de Hadley Wickham):

N.B. en utilisant cette méthode, vous calculerez également la distance entre chaque point et lui-même (ainsi qu'avec tous les autres points). Il est cependant facile de filtrer ces points :

Pour plus d'informations sur l'utilisation de l'ensemble de packages tidyverse, je recommanderais R pour Data Science ou le site Web tidyverse.


Méthodes HTTP prises en charge

Ces modèles prennent en charge les protocoles HTTP et HTTPS. Pour utiliser cette API, vous devez disposer d'une clé Obtenir une clé Bing Maps.

Requêtes GET synchrones

Lorsque vous effectuez une requête GET, l'URL doit ressembler à ceci :

Requêtes GET asynchrones

Crée une tâche pour calculer un isochrone à l'aide d'une requête GET asynchrone. Ce type de demande est recommandé lorsque le paramètre maxTime est supérieur à 30 minutes ou le paramètre maxDistance est supérieur à 15 miles (24 km).

URL de vérification de l'état de la requête asynchrone (GET)

La réponse asynchrone initiale inclut une propriété callbackUrl qui contient l'URL qui peut être utilisée pour vérifier l'état du travail. Alternativement, l'URL de rappel peut également être générée en ajoutant le requestId qui est renvoyé dans la demande asynchrone initiale avec la même clé Bing Maps utilisée, avec le point de terminaison IsochroneAsyncCallback comme indiqué ci-dessous. La réponse à cette demande indiquera si la demande est complète ou non, si elle est complète, elle fournira un URL de résultat propriété qui est une URL qui peut être utilisée pour télécharger les résultats.

Requêtes POST synchrones

Lorsque vous effectuez une requête POST, l'URL doit ressembler à ceci :

Requêtes POST asynchrones

Crée une tâche pour calculer un isochrone à l'aide d'une requête POST asynchrone. Ce type de demande est recommandé lorsque le paramètre maxTime est supérieur à 30 minutes ou le paramètre maxDistance est supérieur à 15 miles (24 km).


1 réponse 1

Votre algorithme existant me laisse un peu perplexe. En particulier, returnBlobIndicesOfRelevantBlobs ne fait pas grand-chose, sauf que la réponse est parfois fausse. Par exemple, voici ce que j'utilise pour piloter votre code :

Pour plus d'efficacité, vous pouvez éliminer l'utilisation du np.sqrt en utilisant simplement le carré de minimumDistanceFromFocusVertex (ce sont des noms longs!) Que vous n'auriez besoin de calculer qu'une seule fois.

Votre utilisation de 4*minimumDistanceFromFocusVertex semble un peu arbitraire et probablement incorrecte. Pour cet exemple particulier, par exemple, cela fait que le deuxième blob (avec la première coordonnée [12,2]) est supprimé de toute considération ultérieure même si sa troisième coordonnée se trouve dans la plage cible.

Si vous utilisez Python 2.7 (comme moi), vous devez utiliser xrange au lieu de range . La différence est que range alloue réellement de la mémoire et remplit un tableau alors que range ne le fait pas. (Dans Python 3.3, range fait maintenant ce que xrange a fait dans Python 2.7, et xrange est obsolète.)

Enfin, bien qu'il puisse y avoir de bonnes raisons pour votre candidature, je ne comprends pas du tout pourquoi on créerait un tableau d'indices comme réponse finale souhaitée. Si c'est vraiment ce que vous vouliez, alors ce n'est pas grave, mais si vous constatez que vous devez effectuer une transformation supplémentaire avant de l'utiliser, réfléchissez à la manière dont ce code pourrait fournir les résultats sous une forme plus directement utilisable.

Comme vérification finale et test de vitesse, vous pouvez utiliser ceci :

En prime, vous pouvez l'utiliser pour calculer une valeur approximative de $pi$ qui sert de test de santé mentale utile. Cela fonctionne parce que le code ci-dessus place 3 points aléatoires par $n$ blobs dans un carré qui mesure $2r$ de chaque côté pour une aire de $4r^2$. Le code compte ensuite le nombre de points qui se trouvent dans les $r$ unités du centre, ce qui bien sûr décrit un cercle inscrit d'aire $pi r^2$. Puisque tous les points sont placés avec une distribution uniforme, si $a$ est le nombre de points dans le cercle, nous savons que $displaystyle frac <3n>approx frac <4 r^2>$ ou en d'autres termes, que les chances que chaque point atterrisse dans le cercle à l'intérieur du carré sont proportionnelles aux aires du cercle et du carré. Donc, $displaystyle frac<4a> <3n>approx pi$

Lorsque j'exécute le programme sur ma machine avec les valeurs indiquées ci-dessus, j'obtiens :

Je suis sûr qu'il existe des moyens d'accélérer ces calculs, que j'aurai peut-être le temps de poursuivre plus tard.


Calculer efficacement toutes les distances entre un point et un groupe de points dans R

J'ai deux groupes de points, de données et de centres , le premier de taille n et le second de taille K (par exemple, n = 3823 et K = 10 ), et pour chaque i du premier ensemble, je dois trouver j dans le second avec la distance minimale.

Mon idée est simple : pour chaque i , soit dist[j] la distance entre i et j , il me suffit d'utiliser which.min(dist) pour trouver ce que je cherche.

Chaque point est un tableau de 64 doubles, donc

ce qui est extrêmement lent (avec n = 200 , cela prend plus de 40s !!). La solution la plus rapide que j'ai écrite est

Même s'il fait beaucoup de calculs que je n'utilise pas (car dist(m) calcule la distance entre toutes les lignes de m ), il est bien plus rapide que l'autre (quelqu'un peut-il expliquer pourquoi ?), mais c'est pas assez rapide pour ce dont j'ai besoin, car il ne sera pas utilisé qu'une seule fois. Et aussi, le code de distance est très laid. J'ai essayé de le remplacer par

mais cela semble être deux fois plus lent. J'ai aussi essayé d'utiliser dist pour chaque paire, mais c'est aussi plus lent.

Je ne sais pas quoi faire maintenant. Il semble que je fais quelque chose de très mal. Une idée sur la façon de faire cela plus efficacement?

ps : j'ai besoin de cela pour implémenter k-means à la main (et j'ai besoin de le faire, cela fait partie d'une mission). Je crois que je n'aurai besoin que de la distance euclidienne, mais je ne suis pas encore sûr, je préférerai donc avoir un code où le calcul de la distance peut être remplacé facilement. stats::kmeans fait tous les calculs en moins d'une seconde.


8 réflexions sur &ldquo Distances dynamiques dans Power BI &rdquo

Neato. Ce serait cool d'ajouter une sorte de paramétrisation à cela, afin que vous puissiez lui faire renvoyer x plus grandes villes avec popn au-dessus de y.

Bonjour!
Est-il possible d'implémenter dans Excel 2013 power view ?
Meilleures salutations
Lukasz

Salut,
L'article ci-dessus a été très utile pour tracer mes besoins. Cependant, c'est une autre question à laquelle je suis confronté. Comment dois-je ajouter un chiclet ou quelque chose qui me donne le contrôle de sélectionner des actifs dans un rayon de mile spécifique. Je suis en mesure d'y parvenir via le panneau de filtrage, mais je souhaite que cela figure sur ma page de rapport elle-même. Des idées?

Shrey
Cela vous dérangerait-il de partager comment vous avez pu sélectionner un filtre et une carte, cela me permettrait de sélectionner un rayon postal et un rayon d'un kilomètre pour afficher tous les éléments dans ce rayon.

Merci, plutôt nouveau dans les forums géospatiaux de Dax, et cet article a été extrêmement utile, bien que
pour un cas d'utilisation légèrement différent (détermination de la distance des fournisseurs par rapport au point central de Banlieue), mais a fonctionné un régal.

J'essaie de le peaufiner légèrement et j'ai du mal à compter le nombre de fournisseurs à moins de X km de Suburb… en utilisant la banlieue comme filtre dynamique.

Je ne sais pas si vous êtes en mesure d'aider, mais essayez de trouver une mesure Dax appropriée pour calculer le nombre de fournisseurs à moins de X km de l'emplacement de la banlieue pour chaque banlieue.

Article fantastique. Cela m'a énormément aidé. Continuez les trucs cool de Power BI !

Bonjour, je suis tombé sur cet article en cherchant une idée pour analyser les informations de transaction de commande et les distances. Article super sympa. J'essaie de l'appliquer à mon cas d'utilisation, mais j'ai du mal à comprendre comment créer la relation appropriée entre les informations d'adresse existantes et les tables de ville avec des valeurs lat/long. Dans l'ensemble, j'essaie d'évaluer le nombre de transactions effectuées à mesure que la distance augmente entre l'adresse fournie lors d'une transaction et un lieu de prise en charge. Mon modèle de données actuel comprend les détails de la transaction qui ont une adresse complète (ville/état/code postal) et le numéro de l'emplacement du magasin de retrait qui est lié à une table d'emplacement du magasin pour identifier où se trouve le lieu de retrait (ville/état). Dois-je ajouter des informations de latitude/longitude à ma table d'emplacement de magasin ? Ou dois-je utiliser l'identifiant de ville unique qui se trouve sur le tableau lat/long ci-dessus et l'ajouter à mon tableau d'emplacement de magasin ? Toute aide serait grandement appréciée!


Distances des points extrêmes aux centres géographiques

Point extrême Coordonnées Direction de
centres géographiques
50 États*
Miles statutaires
49 États**
Miles statutaires
48 États***
Miles statutaires
Latitude
(N)
Longitude
(W.)
Point Barrow, AK 71°23' 156°29' Nord Ouest 2,507 2,509 2,940
Pointe Pochnoï,
Semisopochnoi, AK
51°57' 179°52'(E.) Nord Ouest 3,372 3,377 3,802
Pointe ouest de
Île d'Amatignak, AK
51°17' 179°09' Nord Ouest 3,352 3,357 3,780
Cap Wrangell,
Île d'Attu, AK
52°55' 172°27'(E.) Nord Ouest 3,625 3,630 4,061
Lac des Bois
Projection, Minnesota
49°23' 95°09' Nord-Est 507 501 1 682
Extrémité nord, (limite N-S) ME-Nouveau-Brunswick, Canada 47°04' 67°47' Nord-Est 1,719 1,713 1,613
West Quoddy Head, ME 44°49' 66°57' est 1,788 1,782 2 1,643
Key West, Floride 24°32' 81°48' Sud-est 1,873 1,869 1,439
Cap Sable, Floride 25°07' 81°05' Sud-est 1,867 1,863 1,437
Log Point, Elliot Key, Floride 25°29' 80°11' Sud-est 1,882 1,877 1,455
East Point, Sainte-Croix, VI 17°45' 64°34' Sud-est 2,938 2,932 2,540
Pointe extrême sud du Texas 25°50' 97°24' Sud 1,370 1,369 971
Point d'étapes,
Amérique Samoa
14°23'(S.) 170°46' Sud-ouest 5,859 5,866 5,954
Orote Point, Guam 13°27' 144°37'(E.) Sud-ouest 6,579 6,584 6,974
Île de Kure, HI 28°25' 178°20' Sud-ouest 4,142 4,148 4,486
Ka Lae, Salut 18°55' 155°41' Sud-ouest 3,463 3,470 3,664
Cap Mendocino, Californie 40°26' 124°24' Ouest 1,091 1,098 1,361
Cap Alava, WA 48°10' 124°44' Ouest 1,018 1,024 1,414

* À l'ouest de Castle Rock, comté de Butte, Dakota du Sud. 44°58' N. - 103°46' O.
** Près de Castle Rock, comté de Butte, Dakota du Sud. 44°59' N. - 103°38' O.
***Près du Liban, comté de Smith, Kansas. 39°50' N. - 98°35' O.

1 La direction générale de la projection du lac des Bois est le nord.
2 La direction générale vers West Quoddy Head est au nord-est.


Étant donné une matrice de distance $D_$, définir $M_ = frac +D^2_-D^2_> 2 ,.$ Une chose qu'il est bon de savoir au cas où la dimensionnalité des données qui ont généré la matrice de distance n'est pas connue est que la plus petite dimension (euclidienne) dans laquelle les points peuvent être intégrés est donnée par le rang $k $ de la matrice $M$. Aucun plongement n'est possible si $M$ n'est pas semi-défini positif.

Les coordonnées des points peuvent maintenant être obtenues par décomposition en valeurs propres : si on écrit $M = USU^T$, alors la matrice $X = U sqrt S$ (on peut prendre la racine carrée élément par élément) donne les positions de les points (chaque ligne correspondant à un point). Notez que, si les points de données peuvent être intégrés dans un espace $k$-dimensionnel, seules $k$ colonnes de $X$ seront non nulles (correspondant à $k$ valeurs propres non nulles de $M$).


1 réponse 1

Simplifiez-vous en passant à un système de coordonnées plus simple. Lorsque vous trouvez le résultat, faites l'inverse.

Faisons pivoter et translater (mais pas mettre à l'échelle) le système de coordonnées de sorte que $vec

_1$ est à l'origine, et $vec

_2$ est à $(r_<12>, 0)$ sur l'axe positif $x$. L'axe $y$ lui est perpendiculaire, croissant vers $vec

_3$. Les vecteurs de base sont $egin chapeau_x = frac_2 - vec

_1>_2 - vec

_1 vert> hat_y = frac_3 - vec

_1 - chapeau_x gauche( (vec

_3 - vec

_1) . chapeau_x ight)>_3 - vec

_1 - chapeau_x gauche( (vec

_3 - vec

_1) . chapeau_x ight) vert> end$ Dans ces nouvelles coordonnées, $egin vec

_1 =& (0, 0) vec

_2 =& (r_<12>, 0) vec

_3 =& (a, b) end$ où $a = (vec

_3 - vec

_1) . vec_x$ et $b = (vec

_3 - vec

_1) . vec_y ge 0$.

Si nous utilisons $vec

_4 = (x, y)$ dans ces nouvelles coordonnées, alors les équations concernant les deux premiers points sont $egin x^2 + y^2 = r_1^2 (r_ <12>- x)^2 + y^2 = r_2^2 end$ En soustrayant ce dernier du premier, nous obtenons $2 r_ <12>x - r_<12>^2 = r_1^2 - r_2^2$ que nous pouvons résoudre trivialement pour $x$ : $x = frac^2 - r_2^2><2 r_<12>>$ On peut alors aussi résoudre pour $y$ (en résolvant pour $y$ dans la première équation de la paire), $y = pm sqrt< r_1 ^2 - x^2 >$

L'équation pour le troisième point est $(x - a)^2 + (y - b)^2 = r_3^2$ et seul le positif ou le négatif $y$ devrait le remplir en effet, $y = b pm carré$

Lorsque vous avez résolu à la fois $x$ et $y$ dans ces nouvelles coordonnées, vous pouvez enfin reconvertir aux coordonnées d'origine : $vec

_4 = vec

_1 + x chapeau_x + y hat_y$

Le système de trois équations à deux dimensions est en réalité surdéterminé. C'est-à-dire qu'il n'y a peut-être aucune solution du tout.

Lorsque les coordonnées et les distances contiennent du bruit ou que vous effectuez des calculs avec une précision finie, l'ordre dans lequel vous étiquetez les trois points affecte les résultats. Une tactique d'atténuation courante consiste à calculer le résultat en trois combinaisons possibles -- il y a six combinaisons possibles, mais l'ordre des deux premiers points n'affecte en réalité que l'arrondi --, et d'utiliser par ex. leur centroïde (moyenne des coordonnées) comme résultat.

Plus correctement, le système d'équations peut être résolu en utilisant les moindres carrés linéaires.

Cependant, dans les applications réelles, le calcul des trois points est généralement beaucoup plus rapide et leurs distances (par rapport aux distances connues) donnent une indication très utile en pratique de l'ampleur du bruit ou des erreurs dans le système.


Abstrait

La distance est une variable clé pour expliquer les conditions environnementales, sociales et économiques et pour définir les modèles spatiaux et temporels. Les recherches antérieures se sont principalement concentrées sur l'utilisation d'algorithmes simples à complexes pour calculer les distances le long des réseaux routiers. En revanche, peu d'algorithmes sont disponibles pour les calculs de distance le long des réseaux fluviaux qui sont souvent plus erratiques, divergents et transitoires que les réseaux routiers. Le transport fluvial est utilisé dans le monde entier, en particulier dans les régions en développement, où les communautés utilisent les réseaux fluviaux pour le transport, l'accès aux ressources naturelles et pour les échanges et le commerce. Cet article présente une méthodologie développée pour cartographier des réseaux fluviaux complexes pour l'analyse des distances parcourues. La méthodologie a été appliquée dans quatre grands bassins fluviaux de l'Amazonie occidentale sur quelque 35 000 km de long et incorporant 919 communautés comme origines/destinations. Une méthodologie d'analyse des coûts et du réseau a été créée à l'aide d'ensembles de données vectorielles et raster dans un système d'information géographique (SIG) pour évaluer les interactions entre les communautés et les distances parcourues par le fleuve pour atteindre les capitales de district, les grands centres urbains et les marchés. Une évaluation de la précision utilisant des valeurs de distance calculées à partir d'une étude précédente utilisant une approche méthodologique différente dans la région ainsi que Google Earth Pro, a trouvé un degré élevé de concordance pour les calculs de distance. Notre méthodologie crée une approche très flexible pour les systèmes fluviaux complexes qui peut être utilisée pour calculer les distances fluviales de manière adaptative et efficace et qui peut être utilisée dans d'autres régions du monde où les communautés rurales doivent dépendre des rivières pour le transport.


Voir la vidéo: Distance entre 2 points - Géométrie analytique