Suite

Calculer la somme des distances entre plusieurs points dans ArcMap ?

Calculer la somme des distances entre plusieurs points dans ArcMap ?


J'utilise ArcMap 10.2.

J'ai deux couches - l'une est d'environ 2 000 urnes géolocalisées tandis que l'autre est d'environ une douzaine d'installations géolocalisées. Je voudrais calculer la distance totale entre chaque urne et la douzaine d'installations. Par exemple, l'urne 1 est à 10 km de l'installation X, à 15 km de l'installation Y et à 20 km de l'installation Z, et ainsi de suite. Ainsi, l'urne 1 se verrait attribuer un score de 45 km. J'aimerais calculer ce score pour l'ensemble des 2000 urnes environ.

Jusqu'à présent, j'ai utilisé l'outil de distance de point où les urnes sont les entités en entrée et les installations sont les entités proches, j'ai laissé le rayon de recherche vide, et ArcGIS produit une table, avec une colonne "DISTANCE" remplie, donc il semble avoir travaillé. Ma question est triple :

  1. Est-ce la bonne procédure ?
  2. Dans quelle unité cette distance est-elle signalée (les projections sont en UTM, donc je suppose qu'elle est par défaut en mètres ?)
  3. Si je laisse le "rayon de recherche" vide, ArcGIS calcule-t-il par défaut les distances dans toute l'étendue de la couche ?

C'est une procédure correcte. Vous pouvez ensuite utiliser le tableau récapitulatif pour obtenir la somme des distances en fonction des identifiants de vos urnes et rejoindre ce tableau.

La distance du point fournit en effet des distances basées sur le système de coordonnées, donc dans votre cas, ce sera des mètres, et si vous ne spécifiez pas de distance, cela fonctionnera sur toute l'étendue.

A titre de remarque, si vous avez un très grand nombre (par exemple 100000) d'urnes et seulement quelques Facilités, vous pouvez créer un ensemble de raster avec une distance euclidienne, les additionner puis extraire les valeurs des points. Ce sera moins précis (en raison de la résolution raster), mais plus rapide.


Créez un champ numérique (double) dans le tableau des bulletins de vote et essayez ceci avec la calculatrice de champ. Bloc de code :

def TotalDist(shp ): p=shp.firstPoint mxd = arcpy.mapping.MapDocument("CURRENT") couches=arcpy.mapping.ListLayers(mxd, "facilities") lr=layers[0] g=arcpy.Geometry() geometryList=arcpy.CopyFeatures_management(lr,g) s=0 pour f dans geometryList : s+=f.distanceTo(p) return s

TotalDist( !Forme!)

Il s'agit de l'approche de la vieille école d'Avenue, ma protestation contre les limitations gênantes de la licence ArcGIS :) Fonctionnera beaucoup plus rapidement


Calculer la longueur de chaque segment séquentiel :

Notez que ceci est pour les points triés. Sinon, triez avant de calculer la longueur des segments séquentiels.

Calculez combien de fois chaque segment se produit dans différentes distances par paires : pour certains segments, le nombre de paires est leftSidePoints*rightSidePoints. En d'autres termes, vous calculez la contribution de chaque longueur de segment en somme totale.

i+1 est des points de côté gauche, n-i-1 est des points de côté droit pour le i-ème segment

La réponse est la somme des contributions de tous les segments :

Presque O(N) algo, ni O(Nlog(N)) (tri standard), ni O(maxX) (tri informatique). La complexité est O(N)loglog(maxX)) ou en disant plus simple O(N)*number_of_bits_in_maxX qui est 5N pour les entiers 32 bits qui est presque linéaire.

La logique principale reste telle que je l'ai décrite ci-dessus. Le point de goulot d'étranglement est le tri - et le facteur O(N)*number_of_bits_in_maxX est l'étape de tri. Nous allons trier le tableau avec l'arbre de Van Emde Boas. Cet arbre prend en charge l'opération findNext(x) - trouve l'élément suivant après x avec une complexité O(loglogmaxX) . Insert a également la complexité O(loglogmaxX) .

Ainsi, le tri de Van Emde Boas ressemble à :

  1. remplir tree dans O(N)*number_of_bits_in_maxX via for(i=0i<ni++) tree.insert(x[i]) où x est un tableau d'entrée non trié.
  2. Trouver min dans O(N) dans un tableau non trié
  3. Tableau trié[0]=min
  4. for(int i=1i<ni++) tableau trié[i] = tree.findNext(tableau trié[i-1])

Ensuite, utilisez ma logique ci-dessus, remplacez simplement les tableaux : x en sortedArray

Notez que le tri VEBTree n'est intéressant qu'en théorie, en pratique il peut avoir un facteur constant caché et pour un petit N , log(N) peut être meilleur que loglog(maxX) et donc, le tri standard peut être plus rapide que le tri arborescent. VEBTree sera cool si N est extrêmement grand alors que maxX n'est qu'un entier de 32 ou 64 bits.

C'est faisable si les points sont triés. Prenons un exemple simple, plus grand que n=3 puisque n*(n-1)/2 (toutes les paires possibles sans doublons où (a,b) et (b,a) sont considérés comme des doublons) dans ce cas est également 3 et est trompeur :

Nous allons d'abord calculer toutes les distances à partir du premier point p[0], il s'agit d'une opération en O(n) et en résultera 12 car |-3 + 1| + |-3 - 1| + |-3 - 3| = 2 + 4 + 6 = 12 .

Nous observons maintenant que puisque les points sont sur une ligne et que le point suivant sera à droite du premier point, nous pouvons donc calculer toutes les distances en soustrayant simplement la distance entre le point courant et précédent de la somme des points précédents qui regarderait en conséquence :

Puisque la distance entre le point 0 et 1 est égale à 2 et que nous devons soustraire cette valeur pour chaque distance calculée précédemment (le point précédent faisait partie de k-1=3 paires). À l'itération suivante, k sera 1 plus petit :

Donc, à la fin, la sommation initiale sera O(n) et nous devrons ensuite faire O(1) n fois, ce qui donnera O(n) .

Cela nous donnerait un tableau de sommes partielles [12,6,2,0]=20 , vous n'avez pas besoin de le stocker, juste pour le visualiser.

Je peux penser à un moyen si les points sont triés. Supposons que nous ayons n points. Considérons deux points adjacents, Pi et Pi+1 , Supposons que la distance entre Pi et les autres Points est Di , La distance entre Pi et Pi+1 est d , Alors Di+1 = Di + i * d - (n - i - 1) * d , Ensuite, nous pouvons calculer les distances d'un point à tous les autres points de O (1) si les distances de son point adjacent gauche à tous les autres points sont connues. Nous avons seulement besoin de calculer le premier point et de mettre à jour en conséquence.

La logique de l'équation est que, lorsqu'on passe de Pi à Pi+1 , toutes les distances de Pi+1 à tous les points à sa gauche sont augmentées de d , les distances de Pi+1 à tous les points à sa droite sont diminué de d.

Il existe une solution possible en temps d'ordre linéaire, indépendamment des points triés ou non triés. Commençons donc par les points n+1 points non triés. Comme indiqué, les points sont le long d'une ligne (disons l'axe x) et ils ont uniquement des valeurs x intégrales. Disons que le premier point est P0 et le dernier est Pn. Cela implique que le nombre total de points est n+1 et que les distances totales par point sont n .

  1. Itérer sur les points pour trouver le minimum ( minX ) et le maximum ( maxX ) X valeurs
  2. Créer un tableau de bits (appelé BitArray[max - min + 1] )
  3. Itérez à nouveau à travers les points et pour chaque point que vous rencontrez, définissez BitArray[minX + currentX] = true
  4. Créez maintenant un autre tableau int Distances[n] et commencez à parcourir toutes les valeurs de BitArray .
    1. Le premier bit serait vrai car il représentera le point minX
    2. Trouvez le prochain bit vrai et définissez Distances[0] = thisX - minX
    3. De cette façon, remplissez toutes les distances consécutives dans le tableau Distances.

    Jusqu'à présent, la complexité d'exécution est de O(maxX - minX), qui est linéaire. Pour des points assez proches, ce sera O(n). De plus, nous avons créé un tableau qui nous indique la distance entre (P0, P1) à l'index 0, entre (P1, P2) à l'index 1, entre (P2, P3) à l'index 2 et ainsi de suite.

    La disposition des points le long de l'axe des x ressemblera à ceci (la ligne pointillée est l'axe des x et chaque * est un point, dn est la distance entre P(n-1) et Pn),

    Maintenant, le calcul est O(n). Juste un simple résumé.

    Comment je suis arrivé à cette somme

    Prenez P0. La somme de la distance de P0 de P1 à Pn

    De la même manière, nous prenons P1 et calculons sa distance de P2 à Pn

    Prenez ensuite le P3. jusqu'à ne considérer finalement que la distance entre P(n-1) et Pn

    En additionnant ces distances, nous obtenons directement la formule que j'ai mentionnée ci-dessus.

    D'où, si les points sont donnés triés, le temps d'exécution est O(n) et si les points sont attribués non triés, le temps d'exécution est O(maxX - minX) qui continue de croître linéairement.


    Procédure

    Les instructions fournies décrivent comment compter le nombre d'entités ponctuelles dans un polygone. Deux options s'offrent à vous pour y parvenir :

    Utiliser l'outil Jointure spatiale

    1. Dans le Jointure spatiale boîte de dialogue, remplissez les champs et paramètres requis comme suit :
      1. Caractéristiques cibles: couche de polygone
      2. Rejoindre les fonctionnalités: entités ponctuelles
      3. Rejoindre l'opération (facultatif): JOIN_ONE_TO_ONE et vérifiez le Conserver toutes les fonctionnalités cibles (facultatif) option.
      4. Option de correspondance (facultatif): COMPLETELY_CONTAINS. Pour cette option, les entités ponctuelles dans les entités jointes sont mises en correspondance lorsqu'une entité cible polygonale les contient complètement.
      5. Laissez les autres paramètres par défaut.

      1. Cliquez sur d'accord pour exécuter l'outil.
      2. Ouvrez la table attributaire de la sortie de jointure et recherchez le Join_Count domaine. Le nombre dans le champ représente le nombre d'entités ponctuelles dans le polygone, qui dans cet exemple est le nombre de tremblements de terre qui se sont produits en Indonésie.

      Créer un champ de comptage et une jointure spatiale entre le fichier de formes de points et le fichier de formes de polygones

      1. Dans la table attributaire du fichier de formes de points, créez un champ appelé 'Count' de type 'Short Integer'.
      2. Calculez le champ Nombre pour qu'il soit égal à 1 en cliquant avec le bouton droit sur le nom du champ, puis en cliquant sur Calculateur de champ.
      3. Tapez l'entier 1 dans la zone de dialogue blanche ci-dessous Compte = , et cliquez sur d'accord.

      1. Cliquez avec le bouton droit sur le fichier de formes de polygones et cliquez sur Jointures et relations > Jointure. Cliquez sur la liste déroulante et sélectionnez Joindre les données d'une autre couche en fonction de l'emplacement spatial.
      2. Spécifiez le fichier de formes de points de l'étape 1.
      3. Sélectionnez la première puce, Chaque polygone reçoit un résumé des attributs numériques. , et vérifiez le Somme boîte.
      4. Spécifiez un emplacement de sortie et cliquez sur d'accord.
      5. Un fichier de formes de polygones avec le champ 'Count' indiquant combien d'entités ponctuelles se trouvent dans chaque entité surfacique est désormais présent. Ceci est généralement nommé 'Sum_Count' ou 'Count_'.

      Cet outil crée une nouvelle classe d'entités en sortie avec les attributs suivants pour chaque entité de la classe d'entités en entrée : indice I de Moran local, score z, valeur p et type de cluster/valeur aberrante ( COType ).

      Les scores z et les valeurs p sont des mesures de signification statistique qui vous indiquent s'il faut ou non rejeter l'hypothèse nulle, caractéristique par caractéristique. En effet, ils indiquent si la similarité apparente (un regroupement spatial de valeurs élevées ou faibles) ou la dissemblance (une valeur aberrante spatiale) est plus prononcée que ce à quoi on pourrait s'attendre dans une distribution aléatoire. Les valeurs p et les scores z de la classe d'entités en sortie ne reflètent aucune correction FDR (False Discovery Rate).

      Un score z positif élevé pour une entité indique que les entités environnantes ont des valeurs similaires (soit des valeurs élevées, soit des valeurs faibles). Le champ COType dans la classe d'entités en sortie sera HH pour un groupe statistiquement significatif de valeurs élevées et LL pour un groupe statistiquement significatif de valeurs faibles.

      Un faible score z négatif (par exemple, inférieur à -3,96) pour une entité indique une valeur aberrante de données spatiales statistiquement significative. Le champ COType dans la classe d'entités en sortie indiquera si l'entité a une valeur élevée et est entourée d'entités avec des valeurs faibles (HL) ou si l'entité a une valeur faible et est entourée d'entités avec des valeurs élevées (LH).

      Le champ COType indiquera toujours les grappes et les valeurs aberrantes statistiquement significatives pour un niveau de confiance de 95 %. Seules les entités statistiquement significatives ont des valeurs pour le champ COType. Lorsque vous cochez le paramètre facultatif Appliquer la correction du taux de fausse découverte (FDR), la signification statistique est basée sur un niveau de confiance corrigé de 95 %.

      Le rendu par défaut de la classe d'entités en sortie est basé sur les valeurs du champ COType.

      Le score z est basé sur le calcul de l'hypothèse nulle de randomisation. Pour plus d'informations sur les scores z, consultez Qu'est-ce qu'un score z ? Qu'est-ce qu'une valeur p ?

      Lorsque la classe d'entités en entrée n'est pas projetée (c'est-à-dire lorsque les coordonnées sont données en degrés, minutes et secondes) ou lorsque le système de coordonnées en sortie est défini sur un système de coordonnées géographiques, les distances sont calculées à l'aide de mesures de corde. Les mesures de distance à la corde sont utilisées car elles peuvent être calculées rapidement et fournissent de très bonnes estimations des vraies distances géodésiques, au moins pour des points situés à environ trente degrés les uns des autres. Les distances de corde sont basées sur un sphéroïde aplati. Étant donné deux points quelconques à la surface de la Terre, la distance à la corde qui les sépare est la longueur d'une ligne passant par la Terre en trois dimensions pour relier ces deux points. Les distances en cordes sont indiquées en mètres.

      Mise en garde:

      Assurez-vous de projeter vos données si votre zone d'étude s'étend au-delà de 30 degrés. Les distances à la corde ne sont pas une bonne estimation des distances géodésiques au-delà de 30 degrés.

      Lorsque des distances de corde sont utilisées dans l'analyse, le paramètre Bande de distance ou Distance de seuil, s'il est spécifié, doit être donné en mètres.

      Héritage:

      Avant ArcGIS 10.2.1, un message d'avertissement s'affichait si les paramètres et les paramètres d'environnement que vous aviez sélectionnés entraînaient des calculs effectués à l'aide de coordonnées géographiques (degrés, minutes, secondes). Cet avertissement vous a conseillé de projeter vos données dans un système de coordonnées projetées afin que les calculs de distance soient précis. À partir de 10.2.1, cependant, cet outil calcule les distances à la corde chaque fois que des calculs du système de coordonnées géographiques sont requis.

      Mise en garde:

      En raison de ce changement, il est peu probable que vous deviez modifier les modèles qui intègrent cet outil si vos modèles ont été créés avant ArcGIS 10.2.1 et si vos modèles incluent des valeurs de paramètres de système de coordonnées géographiques codées en dur. Si, par exemple, un paramètre de distance est défini sur quelque chose comme 0,0025 degrés, vous devrez convertir cette valeur fixe de degrés en mètres et réenregistrer votre modèle.

      Pour les entités linéaires et surfaciques, les centroïdes d'entités sont utilisés dans les calculs de distance. Pour les multipoints, les polylignes ou les polygones avec plusieurs parties, le centroïde est calculé en utilisant le centre moyen pondéré de toutes les parties d'entités. La pondération pour les entités ponctuelles est 1, pour les entités linéaires est la longueur et pour les entités surfaciques est la surface.

      Le champ d'entrée doit contenir une variété de valeurs. Le calcul de cette statistique nécessite une certaine variation dans la variable analysée qu'il ne peut pas résoudre si toutes les valeurs d'entrée sont 1, par exemple. Si vous souhaitez utiliser cet outil pour analyser le modèle spatial des données d'incident, envisagez d'agréger vos données d'incident. L'outil d'analyse optimisée des points chauds peut également être utilisé pour analyser le modèle spatial des données d'incident.

      Les données d'incident sont des points représentant des événements (criminalité, accidents de la circulation) ou des objets (arbres, magasins) où vous vous concentrez sur la présence ou l'absence plutôt que sur un attribut mesuré associé à chaque point.

      La bande de distance ou la distance de seuil par défaut garantira que chaque entité a au moins un voisin, ce qui est important. Mais souvent, cette distance par défaut ne sera pas la distance la plus appropriée à utiliser pour votre analyse. Des stratégies supplémentaires pour sélectionner une échelle appropriée (bande de distance) pour votre analyse sont décrites dans Sélection d'une valeur de bande de distance fixe.

      Lorsque zéro est entré pour le paramètre Distance Band ou Threshold Distance, toutes les entités sont considérées comme voisines de toutes les autres entités lorsque ce paramètre est laissé vide, la distance par défaut sera appliquée.

      Les poids pour les distances inférieures à 1 deviennent instables lorsqu'ils sont inversés. Par conséquent, la pondération des entités séparées par moins d'une unité de distance se voit attribuer une pondération de 1.

      Pour les options de distance inverse ( INVERSE_DISTANCE , INVERSE_DISTANCE_SQUARED ou ZONE_OF_INDIFFERENCE ), deux points coïncidents se verront attribuer un poids de un pour éviter une division nulle. Cela garantit que les caractéristiques ne sont pas exclues de l'analyse.

      Des options supplémentaires pour le paramètre Conceptualisation des relations spatiales, y compris les relations spatio-temporelles, sont disponibles à l'aide des outils Générer la matrice de pondérations spatiales ou Générer des pondérations spatiales du réseau. Pour tirer parti de ces options supplémentaires, utilisez l'un de ces outils pour construire le fichier de matrice de pondérations spatiales avant l'analyse, sélectionnez GET_SPATIAL_WEIGHTS_FROM_FILE pour le paramètre Conceptualization of Spatial Relationships et pour le paramètre Weights Matrix File, spécifiez le chemin d'accès au fichier de pondérations spatiales que vous avez créé. .

      Plus d'informations sur l'analyse de cluster spatio-temporel sont fournies dans la documentation Analyse spatio-temporelle.

      Les couches de carte peuvent être utilisées pour définir la classe d'entités en entrée. Lorsque vous utilisez une couche avec une sélection, seules les entités sélectionnées sont incluses dans l'analyse.

      • Fichiers de matrice de pondérations spatiales au format ASCII :
        • Les poids sont utilisés tels quels. Les relations entité à entité manquantes sont traitées comme des zéros.
        • Si les poids sont normalisés par rangée, les résultats seront probablement incorrects pour les analyses sur les ensembles de sélection. Si vous devez exécuter votre analyse sur un jeu de sélection, convertissez le fichier de pondérations spatiales ASCII en un fichier SWM en lisant les données ASCII dans une table, puis en utilisant l'option CONVERT_TABLE avec l'outil Générer la matrice de pondérations spatiales.
        • Si les poids sont normalisés par ligne, ils seront renormalisés pour les ensembles de sélection, sinon, les poids sont utilisés tels quels.

        L'exécution de votre analyse avec un fichier de matrice de pondérations spatiales au format ASCII est gourmande en mémoire. Pour les analyses sur plus de 5 000 entités, envisagez de convertir votre fichier de matrice de pondérations spatiales au format ASCII en un fichier au format SWM. Mettez d'abord vos poids ASCII dans un tableau formaté (à l'aide d'Excel, par exemple). Ensuite, exécutez l'outil Générer la matrice de pondérations spatiales à l'aide de CONVERT_TABLE pour le paramètre Conceptualisation des relations spatiales. La sortie sera un fichier de matrice de pondérations spatiales au format SWM.

        La classe d'entités en sortie est automatiquement ajoutée à la table des matières avec un rendu par défaut appliqué au champ COType. Le rendu appliqué est défini par un fichier de couche dans <ArcGIS>/Desktop10.x/ArcToolbox/Templates/Layers . Vous pouvez réappliquer le rendu par défaut, si nécessaire, en important la symbologie de la couche modèle.

        La classe d'entités en sortie comprend un champ SOURCE_ID qui vous permet de la joindre à la classe d'entités en entrée , si nécessaire.

        La rubrique d'aide Modélisation des relations spatiales fournit des informations supplémentaires sur les paramètres de cet outil.

        Mise en garde:

        Lorsque vous utilisez des fichiers de formes, gardez à l'esprit qu'ils ne peuvent pas stocker de valeurs nulles. Les outils ou autres procédures qui créent des fichiers de formes à partir d'entrées autres que des fichiers de formes peuvent stocker ou interpréter des valeurs nulles comme zéro. Dans certains cas, les valeurs NULL sont stockées sous forme de très grandes valeurs négatives dans les fichiers de formes. Cela peut conduire à des résultats inattendus. Voir Considérations relatives au géotraitement pour la sortie du fichier de formes pour plus d'informations.

        Héritage:

        Avant ArcGIS 10.0, la classe d'entités en sortie était un doublon de la classe d'entités en entrée avec les champs de résultat COType , z-score et p-value ajoutés. Après ArcGIS 10.0, la classe d'entités en sortie inclut uniquement les résultats et les champs utilisés dans l'analyse.

        Lors de l'utilisation de cet outil dans des scripts Python, l'objet de résultat renvoyé par l'exécution de l'outil a les sorties suivantes :


        Comment trouver la ligne avec la somme minimale des distances à plusieurs points?

        Je programme sur une petite simulation physique en ce moment. Le problème mathématique auquel je suis confronté maintenant est assez difficile pour moi, un lycéen de 17 ans. Mais comme j'ai vraiment besoin de résoudre ce problème, j'ai pensé que je pourrais simplement demander si quelqu'un sait quelque chose sur le problème.

        Étant donné un certain nombre de points, trouvez une droite qui se rapproche le plus de ces points.

        Je sais que cela ressemble beaucoup à une ligne de régression, mais une ligne de régression minimise les distances y entre la ligne et les points. Je veux faire une approximation non pas dans un sens statistique comme la droite de régression, mais dans un sens géométrique. Je veux minimiser les distances réelles les plus courtes à angle droit entre les points et la ligne. distances à minimiser (rouge)

        La seule solution à laquelle je pouvais penser était de créer une fonction (f(m , h)) qui prend les paramètres d'une ligne (y = mx + h) et donne la somme des distances au carré. Mais trouver un minimum d'une fonction multivariée aussi longue n'était pas possible pour moi.

        Comme cela me semble basique, je pensais que ce problème était bien documenté, mais je n'ai rien trouvé à ce sujet. Merci de me rediriger si vous connaissez le nom de ce problème.


        Dans un triangle, les variables $a, b, c$ sont typiquement réservées aux longueurs des côtés. Pour éviter toute confusion, j'utiliserai $r_a, r_b, r_c$ pour désigner les distances d'un point $P$ aux côtés correspondants. Soit $Delta$ l'aire du triangle. Pour tout point $P$ sur ou à l'intérieur du triangle, on a

        $somme_ a r_a = a r_a + b r_b + c r_c = 2Delta ag<*1>$

        De plus, si des triplets de nombres non négatifs $x_a, x_b, x_c$ satisfont $(*1)$, il existe un point $P$ sur ou à l'intérieur du triangle avec $(r_a, r_b, r_c) = (x_a, x_b, x_c)$.

        Soit $displaystylek = frac<2Delta> a^2> = frac<2Delta>$, la somme des distances au carré peut être réécrite comme

        $commencersomme_ r_a^2 &= somme_ left( (r_a - k a)^2 + 2k a r_a - k^2 a^2 ight) &= sum_ (r_a - k a)^2 + 2gauche(frac<2Delta> a^2> ight)left(sum_ a r_a ight) - left(frac<2Delta> a^2> ight)^2 left( sum_ a^2droit) &= somme_ (r_a - k a)^2 + frac<4Delta^2> a^2> fin ag <*2>$ Depuis $sum_ a (ka) = 2Delta$, il existe un point sur ou à l'intérieur du triangle avec $(r_a, r_b, r_c) = (ka, kb, kc)$.
        Le minimum de somme des distances au carré est atteint à ce stade avec la valeur $displaystylefrac<4Delta^2>$.

        Veuillez noter que ce point particulier est appelé point symmédien (ou encore point de Lemoine ou point de Grèbe). Après avoir terminé cette réponse, une recherche indique que cette propriété particulière a déjà été demandée. Regardez cette question pour plus de réponses.


        Ce lien pourrait vous être utile, car il détaille l'utilisation de la formule Haversine pour calculer la distance.

        Ce script [en Javascript] calcule les distances orthodromiques entre les deux points - c'est-à-dire la distance la plus courte sur la surface de la terre - à l'aide de la formule « Haversine ».

        J'avais besoin de calculer beaucoup de distances entre les points pour mon projet, alors je suis allé de l'avant et j'ai essayé d'optimiser le code, j'ai trouvé ici. En moyenne dans différents navigateurs ma nouvelle implémentation fonctionne 2 fois plus vite que la réponse la plus élevée.

        Vous pouvez jouer avec mon jsPerf et voir les résultats ici.

        Récemment, j'ai eu besoin de faire la même chose en python, voici donc un implémentation python:

        Et par souci d'exhaustivité : Haversine sur wiki.

        Voici une implémentation C# :

        Voici une implémentation Java de la formule Haversine.

        Notez qu'ici nous arrondissons la réponse au km le plus proche.

        Merci beaucoup pour tout cela. J'ai utilisé le code suivant dans mon application iPhone Objective-C :

        La latitude et la longitude sont en décimales. Je n'ai pas utilisé min() pour l'appel asin() car les distances que j'utilise sont si petites qu'elles n'en ont pas besoin.

        Il donnait des réponses incorrectes jusqu'à ce que je transmette les valeurs en radians - maintenant c'est à peu près les mêmes que les valeurs obtenues à partir de l'application Map d'Apple :-)

        Si vous utilisez iOS4 ou une version ultérieure, Apple fournit des méthodes pour ce faire afin d'obtenir la même fonctionnalité avec :

        Il s'agit d'une simple fonction PHP qui donnera une approximation très raisonnable (sous +/-1% de marge d'erreur).

        Comme dit précédemment, la terre n'est PAS une sphère. C'est comme une vieille, vieille balle de baseball avec laquelle Mark McGwire a décidé de s'entraîner - elle est pleine de bosses et de bosses. Les calculs les plus simples (comme celui-ci) le traitent comme une sphère.

        Différentes méthodes peuvent être plus ou moins précises selon l'endroit où vous vous trouvez sur cet ovoïde irrégulier ET la distance entre vos points (plus ils sont proches, plus la marge d'erreur absolue est faible). Plus vos attentes sont précises, plus les calculs sont complexes.

        Je poste ici mon exemple de travail.

        Répertoriez tous les points du tableau ayant une distance entre un point désigné (nous utilisons un point aléatoire - lat:45.20327, long:23.7806) inférieur à 50 KM, avec latitude et longitude, dans MySQL (les champs du tableau sont coord_lat et coord_long):

        Listez tous ceux ayant DISTANCE<50, en kilomètres (considéré rayon terrestre 6371 KM):

        L'exemple ci-dessus a été testé dans MySQL 5.0.95 et 5.5.16 (Linux).

        Dans les autres réponses, une implémentation dans r est manquante.

        Le calcul de la distance entre deux points est assez simple avec la fonction distm du package geosphere :

        Comme la terre n'est pas parfaitement sphérique, la formule de Vincenty pour les ellipsoïdes est probablement la meilleure façon de calculer les distances. Ainsi dans le package geosphere vous utilisez alors :

        Bien sûr, vous n'êtes pas obligé d'utiliser le package geosphere, vous pouvez également calculer la distance en base R avec une fonction :

        Le haversine est certainement une bonne formule pour probablement la plupart des cas, d'autres réponses l'incluent déjà, donc je ne vais pas prendre de la place. Mais il est important de noter que quelle que soit la formule utilisée (oui pas une seule). En raison de la vaste plage de précision possible ainsi que du temps de calcul requis. Le choix de la formule nécessite un peu plus de réflexion qu'une simple réponse évidente.

        Cette publication d'une personne de la nasa est la meilleure que j'ai trouvée pour discuter des options

        Par exemple, si vous triez simplement les lignes par distance dans un rayon de 100 miles. La formule de la terre plate sera beaucoup plus rapide que la haversine.

        Remarquez qu'il n'y a qu'un cosinus et une racine carrée. Contre 9 d'entre eux sur la formule Haversine.

        Il pourrait y avoir une solution plus simple et plus correcte : le périmètre de la terre est de 40 000 km à l'équateur, environ 37 000 sur le cycle de Greenwich (ou n'importe quelle longitude). Ainsi:

        Je suis d'accord pour qu'il soit affiné car, j'ai moi-même dit que c'est un ellipsoïde, donc le rayon à multiplier par le cosinus varie. Mais c'est un peu plus précis. Par rapport à Google Maps, cela a considérablement réduit l'erreur.

        Je n'aime pas ajouter une autre réponse, mais l'API Google maps v.3 a une géométrie sphérique (et plus). Après avoir converti votre WGS84 en degrés décimaux, vous pouvez faire ceci :

        Aucun mot sur la précision des calculs de Google ou même sur le modèle utilisé (bien qu'il dise "sphérique" plutôt que "géoïde". D'ailleurs, la distance "en ligne droite" sera évidemment différente de la distance si l'on voyage sur le surface de la terre, ce que tout le monde semble présumer.

        Implémentation Python Origin est le centre des États-Unis contigus.

        Pour obtenir la réponse en kilomètres, définissez simplement miles=false.

        Toutes les réponses ci-dessus supposent que la terre est une sphère. Cependant, une approximation plus précise serait celle d'un sphéroïde aplati.

        Vous pouvez utiliser la construction dans CLLocationDistance pour calculer ceci :

        Dans votre cas, si vous voulez des kilomètres, divisez simplement par 1000.

        Voici une manuscrit mise en œuvre de la formule Haversine

        Comme indiqué, un calcul précis doit tenir compte du fait que la terre n'est pas une sphère parfaite. Voici quelques comparaisons des différents algorithmes proposés ici :

        Sur de petites distances, l'algorithme de Keerthana semble bien coïncider avec celui de Google Maps. Google Maps ne semble suivre aucun algorithme simple, ce qui suggère que c'est peut-être la méthode la plus précise ici.

        Quoi qu'il en soit, voici une implémentation Javascript de l'algorithme de Keerthana :

        Voici l'implémentation SQL pour calculer la distance en km,

        Pour plus de détails sur la mise en oeuvre par langage de programmation, vous pouvez simplement passer par le script php donné ici

        Ce script [en PHP] calcule les distances entre les deux points.

        Pour calculer la distance entre deux points sur une sphère, vous devez faire le calcul du Grand Cercle.

        Il existe un certain nombre de bibliothèques C/C++ pour vous aider avec la projection cartographique sur MapTools si vous devez reprojeter vos distances sur une surface plane. Pour ce faire, vous aurez besoin de la chaîne de projection des différents systèmes de coordonnées.

        Vous pouvez également trouver MapWindow un outil utile pour visualiser les points. De plus, en tant qu'open source, il s'agit d'un guide utile sur l'utilisation de la bibliothèque proj.dll, qui semble être la bibliothèque de projection open source principale.

        Voici mon implémentation Java pour le calcul de la distance via les degrés décimaux après quelques recherches. J'ai utilisé le rayon moyen du monde (de wikipedia) en km. Si vous voulez des miles de résultat, utilisez le rayon mondial en miles.

        Voici l'implémentation de réponse acceptée portée sur Java au cas où quelqu'un en aurait besoin.

        voici un exemple en postgres sql (en km, pour la version miles, remplacez la version 1.609344 par la version 0.8684)

        Pour ceux qui recherchent une formule Excel basée sur les normes WGS-84 et amp GRS-80 :

        Voici l'implémentation VB.NET, cette implémentation vous donnera le résultat en KM ou en Miles en fonction d'une valeur Enum que vous passez.

        J'ai condensé le calcul en simplifiant la formule.

        La solution de Chuck, valable pour les miles aussi.

        Dans Mysql, utilisez la fonction suivante, passez les paramètres en utilisant POINT (LONG, LAT)

        Voici un autre converti en Rubis code:

        Comme il s'agit de la discussion la plus populaire sur le sujet, j'ajouterai ici mon expérience de fin 2019-début 2020. Pour compléter les réponses existantes, mon objectif était de trouver une solution précise ET rapide (c'est-à-dire vectorisée).

        Commençons par ce qui est principalement utilisé par les réponses ici - l'approche Haversine. Il est trivial de vectoriser, voir exemple en python ci-dessous :

        Côté précision, c'est le moins précis. Wikipédia indique 0,5% d'écart relatif en moyenne sans aucune source. Mes expériences montrent moins d'écart. Vous trouverez ci-dessous la comparaison effectuée sur 100 000 points aléatoires par rapport à ma bibliothèque, ce qui devrait être précis au millimètre près :

        Donc en moyenne un écart de 2,5 km sur 100 000 paires de coordonnées aléatoires, ce qui peut être bon pour la majorité des cas.

        L'option suivante est les formules de Vincenty qui sont précises jusqu'au millimètre, selon les critères de convergence et peuvent également être vectorisées. Il a le problème de la convergence près des points antipodaux. Vous pouvez le faire converger à ces points en assouplissant les critères de convergence, mais la précision chute à 0,25% et plus. En dehors des points antipodes, Vincenty fournira des résultats proches de Geographiclib avec une erreur relative inférieure à 1.e-6 en moyenne.

        Geographiclib, mentionné ici, est vraiment l'étalon-or actuel. Il a plusieurs implémentations et assez rapide, surtout si vous utilisez la version C++.

        Maintenant, si vous envisagez d'utiliser Python pour tout ce qui dépasse 10 000 points, je vous suggère d'envisager mon implémentation vectorisée. J'ai créé une bibliothèque geovectorslib avec la routine Vincenty vectorisée pour mes propres besoins, qui utilise Geographiclib comme solution de repli pour les points proches des antipodes. Vous trouverez ci-dessous la comparaison vs Geographiclib pour 100 000 points. Comme vous pouvez le voir, il fournit jusqu'à Amélioration 20x pour l'inverse et 100x pour le direct méthodes pour 100 000 points et l'écart augmentera avec le nombre de points. Sur le plan de la précision, ce sera dans les limites de 1.e-5 rtol de Georgraphiclib.


        9. Traversée

        Les géomètres mesurent généralement les positions en série. À partir de points de contrôle, ils mesurent les angles et les distances jusqu'à de nouveaux emplacements et utilisent la trigonométrie pour calculer les positions dans un système de coordonnées planes. Mesurer une série de positions de cette manière est connu sous le nom de « faire un cheminement ». Un cheminement qui commence et se termine à différents endroits est appelé un traversée ouverte.

        Par exemple, disons que les coordonnées UTM du point A de la figure 5.10.1 sont 500 000,00 E et 5 000 000,00 N. La distance entre les points A et P, mesurée avec un ruban d'acier ou un EDM, est de 2 828,40 mètres. L'azimut de la ligne AP, mesuré avec un transit ou un théodolite, est de 45º. A l'aide de ces deux mesures, les coordonnées UTM du point P peuvent être calculées comme suit :

        XP = 500 000,00 + (2 828,40 × sin 45°) = 501 999,98
        OuiP = 5 000 000,00 + (2 828,40 × cos 45°) = 5 001 999,98

        Un cheminement qui commence et se termine au même point, ou à deux points différents mais connus, est appelé un traversée fermée. Measurement errors in a closed traverse can be quantified by summing the interior angles of the polygon formed by the traverse. The accuracy of a single angle measurement cannot be known, but since the sum of the interior angles of a polygon is always (n-2) × 180, it's possible to evaluate the traverse as a whole, and to distribute the accumulated errors among all the interior angles.

        Errors produced in an open traverse, one that does not end where it started, cannot be assessed or corrected. The only way to assess the accuracy of an open traverse is to measure distances and angles repeatedly, forward and backward, and to average the results of calculations. Because repeated measurements are costly, other surveying techniques that enable surveyors to calculate and account for measurement error are preferred over open traverses for most applications.


        What Is Walkability?

        Walkability is a measure of the effectiveness of community design in promoting walking and bicycling as alternatives to driving cars to reach shopping, schools, and other common destinations. The Centers for Disease Control and Prevention (CDC), the World Health Organization (WHO), and other health organizations advocate increasing the walkability of communities to promote fitness, combat obesity, and enhance sustainability.

        Quantifying Walkability

        For this project, three factors&mdashdensity, diversity, and design&mdashwere calculated for use in measuring walkability. Density was quantified as residential population density and job density. Diversity was quantified as the percentage of residents within walking distance of defined diverse uses (DUs) that provide a measure of mixed-used development. Design was quantified as trail availability per 1,000 residents, bicycle path availability per 100 residents, and the number of intersections per square kilometer.

        These factors were equally important when assessing the walkability of an area. From a GIS standpoint, calculations relating to density and diversity were relatively simple and enabled by ArcGIS technology.


        These screen captures illustrate the difference between service areas for a post office created using Euclidean distance buffering (left) and street network buffering (right). The residential parcels northwest of post offices are not classified as walkable when Network Analyst is used to create the buffer. In this realistic scenario, a water body impedes walkability of these post office locations. Note: Sample data used to protect privacy of residents.

        Five analysis areas (AAs) in the Halton Region were specified for the project:

        • Dissemination areas (small areas composed of one or more neighboring blocks with a population of 400 to 700 persons)
        • Census tracts
        • Neighborhoods
        • Municipalities
        • The Halton Region as a whole

        Dissemination areas were the smallest AAs because they showed an acceptable level of detail while still allowing comparisons to census data.

        Halton Region's Health Department defined three parameters needed to determine and quantify diversity:

        • AAs for which walkability needs to be determined
        • DUs needed by residents
        • The distances to/from DUs (in meters) considered walkable distances

        Table 1 lists the DUs used for the project, along with the walkable distance criteria to the DU location. These distances represent 5- and 10-minute walking times (except for elementary schools).

        Diverse Use (DU) Walking Distance Criteria
        (i.e., distance from residence to DU)
        Transit stops &le 400 meters
        Grocery stores &le 800 meters
        Fresh food places &le 800 meters
        Convenience stores &le 400 meters
        Elementary schools &le 1,500 meters
        Table 1: A sample of DUs used in the project along with walking distance criteria

        Gathering and Preparing Data for Analysis

        Datasets required to conduct the walkability analysis were AAs as polygons, streets as lines, residential locations with population information as polygons and points, and DU locations as points. The AAs and streets layers were available from the region's spatial database. Residence locations were extracted from the Ontario Municipal Property Assessment Corporation (MPAC) parcel layer. The MPAC parcel, street, census tract, municipality, and region layers were current as of 2011. The dissemination areas file was from 2006, and the neighborhoods file was from 2009.

        The MPAC parcel property code (PROP_CODE) and structure code (STRUCTURE_) fields were used to identify residential parcels. These parcels were exported and formed the residential parcel location polygon layer. A persons per unit (PPU) attribute field, added to the residential parcel layer, described the average number of people associated with a particular residential dwelling type (e.g., PPU for single-family dwelling units was 3.08).

        PPU values were calculated by Halton Region's Planning Services. For parcels with multiple units, parcel roll numbers were used with the MPAC Municipal Connect online database to verify the number of residential units on a parcel. The PPU field was multiplied by the number of units on the parcel to get the total population for the parcel. This value, stored in the UNIT_POP field, described the total population of a residential parcel. Calculating population using the PPU field enabled estimating current population on a per parcel basis. Moreover, census population information was outdated the most recent census information was 2006.

        A copy of the residential parcels polygon layer was exported as a point layer using the Feature To Point tool (ArcToolbox > Data Management > Features). Both residential parcel polygon and point layers were used later in the analysis workflow.

        Geocoding DU Addresses

        Of the DU data items listed in Table 1, only transit stops were available as a shapefile. Most DU location addresses, available from a Microsoft Access database, were gathered as part of the 2010 Halton Region Places of Employment Survey. The required DUs were identified (and exported as Microsoft Excel tables) by North American Industry Classification System (NAICS) code field. (NAICS identifies business and service types.) Addresses for postal service locations (not available from the employment survey) were gathered from the Canada Post website. Education Services addresses were gathered by contacting school boards in the region, in addition to the addresses of private and public higher education institutions within Halton. Similarly, Fresh Food Places address data was gathered by contacting local organic and fresh food stores.

        Having the DU locations available as a point shapefile was critical to the walkability analysis workflow. ArcGIS 9.3.1's geocoding tools converted DU addresses into spatial points. A new geocoding address locator was created using an address point shapefile. The Zone field in the address locator enabled identification of street addresses with the same street name that are located in different municipalities (for example, 543 King Street exists in both Oakville and Halton Hills). A high minimum match score minimized the chance of a DU address being matched to the wrong address point.

        The automated geocoding process achieved a success rate of more than 90 percent for all DU addresses geocoded. The Pick Address From Map tool in the Geocoding Review/Rematch Addresses function helped bring the geocoding match rate up to 100 percent. This tool was used to pick points on the map that were verified as locations of unmatched addresses.

        Determining Diversity

        Having gathered and prepared the data required for analysis, the next steps involved determining the percentage of residents who live a walkable distance from DUs. Analysis involved repeating workflow steps for different input parameters such as AAs and DUs. ModelBuilder 9.3 was used to automate this process. The workflow steps for this analysis included

        • Calculate and assign the total residential population for each AA.
        • Calculate a service area (SA) for a DU.
        • Select residential parcels that intersect the SA for each DU.
        • Calculate the percentage of residents in each AA with walkable access to a specified DU.
        • Classify and visualize walkability.

        Calculate and Assign the Total Residential Population for Each AA

        The total residential population was calculated and assigned as the sum of the UNIT_POP field for all residential parcel points that were within the specified AA. In assigning total residential population to an AA, residential parcel points were used instead of residential parcels to prevent parcels that fall on the border of multiple AAs from being included in the total population calculation of multiple AAs.


        This model assigns total residential population to an analysis area.

        Intersecting residential parcel points for Home, Furniture, Furnishings, and Equipment Stores service areas

        Calculate Service Area for a DU

        The SA for a DU was based on the walking distance criteria in Table 1 and represented all the locations that have walkable access to the specified DU. Using straight-line Euclidean distance to create a buffer around the DU was initially considered as a solution to create the SAs. However, this method wasn't realistic from a walkability standpoint because it didn't account for physical barriers such as water bodies, railway lines, buildings, and other obstructions.

        Network Analyst 9.3 tools were used in ModelBuilder to design an algorithm that calculated the SA for a DU, using the Halton street network. This SA model represented a more realistic visualization of walkable access to a DU by using the street network rather than Euclidean distance.

        In ArcCatalog, the Halton streets layer (Streets_Ctrline.shp) was used to create a new network dataset for network analysis. The distance in meters was the only cost associated with the network dataset, because no network analysis involving travel time was required. After the SA is calculated, it is exported as a polygon layer. The Select Facility parameter specifies the DU for which SA is to be calculated. Created SA polygons were merged and trimmed to 30 meters. This distance was determined to be the best distance for ensuring that only residential parcels identified as walkable to the DU were selected.


        Model for calculating service areas for diverse uses and exporting it as a polygon

        Select Residential Parcels That Intersect the SA for Each DU

        This step involved selecting residential parcels within walkable distance from a specific DU. The selected residential parcels were converted to residential parcel points to prevent walkable parcels that fall on AA borders from being included in multiple AAs in the next step.


        Model for selecting residential parcels that are in walking distance to a specified diverse use

        Calculate the Percentage of Residents in Each AA with Walkable Access to Specified DU

        Listing 1 illustrates how the percentage of residents with walkable access to a specific DU is calculated. This step also assigns the calculated proportion to the AA shapefile.

        The Visual Basic for Applications (VBA) code in Listing 1 was used in the Calculate Field tool to calculate the proportion of residents (PR16DUPost field) that live a walkable distance from a post office. A conditional statement is required to prevent illegal division by 0 (in the case that total residential population of an AA is zero).


        A model for calculating the total residential population of an analysis area

        Dim x as Double
        If ([MAX_TotRes] > 0) Then
        x = [SUM_UNIT_P] / [MAX_TotRes] * 100
        Else
        X = 0
        End If Listing 1: Percentage of population in walkable residences

        Classify and Visualize Walkability

        The results of the walkability analysis were used to construct a database that contained walkability calculations for density, diversity, and design for each dissemination area. This database was used to summarize results for census tracts, neighborhoods, municipalities, and the Halton Region. Choropleth map layouts for various DUs for different AAs were produced to visualize walkability to DUs. The maps displayed AAs classified by the walkability percentage field. The areas in red represent the areas with low walkability to elementary schools. A separate walkability map for each DU enables the planning process to focus on services that are most in need, for a given AA.

        Project Repeatability

        The walkability project took approximately three months to complete. A key goal for this project was repeatability. The analysis workflow should easily be repeated with updated data and criteria. Creating a custom ArcGIS toolbox that houses custom ModelBuilder models enables the project to be repeated in significantly shorter time periods by users who don't have extensive technical GIS knowledge.

        The entire walkability analysis workflow for the diversity factor (excluding data gathering/preparation) can be repeated by running the four models in the custom Walkability Tools toolbox developed for this project. Running the models in batch mode lets models use multiple inputs simultaneously and saves both time and effort.

        Conclusion

        An area's walkability is not a single quantifiable measurement. Walkability, in this study, was measured using calculations related to an area's density, diversity, and design. These three factors provide valuable information for assessing an area's walkability. Examining the database and walkability maps of the various DUs for different AAs provides a context for determining whether an area needs more social marketing to encourage walking (if walkability is high) or better design to increase access (if walkability is low). ArcGIS 9.3.1 geocoding tools, ModelBuilder 9.3, and the Network Analyst 9.3 extension are key GIS technologies that make a realistic determination and visualization of walkability feasiblity. ModelBuilder, in particular, enables project repeatability while minimizing project completion timelines.

        About the Authors

        Arjun Rattan is a GIS planning assistant at Halton Region's Planning Services Division. Before joining Halton, he earned a bachelor's degree in urban studies and art history from the University of Toronto and completed a two-year diploma in geomatics from Sir Sandford Fleming College in Lindsay, Ontario.

        Anthony Campese is a GIS analyst with the Legislative & Planning Services Department who is responsible for maintaining the GIS functions in the Planning Services Division and acts as a liaison with IT staff. He has worked in the public sector for 12 years. He is also an instructor in real property administration and public administration&mdashmunicipal programs at Seneca College. He is a graduate of Fleming College's GIS Applications Specialist program and holds a degree in urban geography from Brock University.

        Chris Eden is a GIS data technician with the Legislative & Planning Services Department. He is responsible for maintaining the planning data and field collection of data. Eden has been working in the public sector for eight years. He is a graduate of Ryerson University's Geographic Analysis program.


        You are comparing trajectories, or curves. This is a studied topic. Procrustes analysis and dynamic time warping, as EMS says, are tools of the trade. Once you've aligned the curves you'll want to measure the distance, say the Fréchet distance. If you want to share some of your data we could take a crack at it ourselves.

        If you disregard the temporal dimension:

        You could fit the User and Teacher to multivariate Gaussian densities and find the volume of their product--that's pretty easy. If you want more accuracy, you could use a nonparametric density estimate instead.

        You might consider Procrustes distance, or some distance based on dynamic time warping (even if one of your dimensions is not "time" per se, you can still use this transformation idea). See this recent work on Tracklets for an illustrative use case of dynamic time warping for measuring similarity between 3D space curves carved out by point trajectories in videos.

        There are many libraries with built-in Procrustes distance calculations, such as Matlab, or the PyGeometry library for Python.

        The original post asked for a metric between ORDERED points in 3D. The only such metric is the Frechet distance. There was no mention of time as one of the dimensions, so I would assume that all the dimensions have units of distance (i.e. the units are not mixed). This can be done by modifying a function recently uploaded to the MathWorks file exchange (Frechet distance calculation: http://www.mathworks.com/matlabcentral/fileexchange/38714). These routines were written for points in the plane, but the extension to 3D points is straightforward.

        Hausdorff Distance might be what you are looking for. Hausdorff Distance between two point sets $X$ and $Y$ is defined as, $d_H(X, Y) = max inf_ ||x - y||, sup_ inf_ ||x - y||>$.

        Similarity is quantity that reflects the strength of relationship between two objects or two features. This quantity is usually having range of either -1 to +1 or normalized into 0 to 1. Than you need to calculate the distance of two features by one of the methods below:

        1. Simple Matching distance
        2. Jaccard's distance
        3. Hamming distance
        4. Jaccard's coefficient
        5. simple matching coefficient

        For line. you can represent it by angle (a) and length (l) properties or L1= P1(x1,y1), P2(x2,y2) below is the similarity with a and l.

        now measure the angle for angles and lengths

        • A_user =20 and Length_User =50
        • A_teacher30 and Length_Teacher =55
        • Now, normalize the values.

        similarity = SquareRoot((A_user - A_teacher30 )^2 +(Length_User - Length_Teacher )^2)

        gives the similarity measure. You can also use above mentioned methods based on the problem and the features.


        19. User Equivalent Range Errors

        "UERE" is the umbrella term for all of the error sources below, which are presented in descending order of their contributions to the total error budget.

        1. Satellite clock: GPS receivers calculate their distances from satellites as a function of the difference in time between when a signal is transmitted by a satellite and when it is received on the ground. The atomic clocks on board NAVSTAR satellites are extremely accurate. They do tend to stray up to one millisecond of standard GPS time (which is calibrated to, but not identical to, Coordinated Universal Time). The monitoring stations that make up the GPS "Control Segment" calculate the amount of clock drift associated with each satellite. GPS receivers that are able to make use of the clock correction data that accompanies GPS signals can reduce clock error significantly.
        2. Upper atmosphere (ionosphere): Space is nearly a vacuum, but the atmosphere isn't. GPS signals are delayed and deflected as they pass through the ionosphere, the outermost layers of the atmosphere that extend from approximately 50 to 1,000 km above the Earth's surface. Signals transmitted by satellites close to the horizon take a longer route through the ionosphere than signals from satellites overhead, and are thus subject to greater interference. The ionosphere's density varies by latitude, by season, and by the time of day, in response to the Sun's ultraviolet radiation, solar storms and maximums, and the stratification of the ionosphere itself. The GPS Control Segment is able to model ionospheric biases, however. Monitoring stations transmit corrections to the NAVSTAR satellites, which then broadcast the corrections along with the GPS signal. Such corrections eliminate only about three-quarters of the bias, however, leaving the ionosphere the second largest contributor to the GPS error budget.
        3. Receiver clock: GPS receivers are equipped with quartz crystal clocks that are less stable than the atomic clocks used in NAVSTAR satellites. Receiver clock error can be eliminated, however, by comparing times of arrival of signals from two satellites (whose transmission times are known exactly).
        4. Satellite orbit: GPS receivers calculate coordinates relative to the known locations of satellites in space. Knowing where satellites are at any given moment involves knowing the shapes of their orbits as well as their velocities. The gravitational attractions of the Earth, Sun, and Moon all complicate the shapes of satellite orbits. The GPS Control Segment monitors satellite locations at all times, calculates orbit eccentricities, and compiles these deviations in documents called ephemerides. An ephemeris is compiled for each satellite and broadcast with the satellite signal. GPS receivers that are able to process ephemerides can compensate for some orbital errors.
        5. Lower atmosphere: (troposphere, tropopause, and stratosphere) The three lower layers of atmosphere encapsulate the Earth from the surface to an altitude of about 50 km. The lower atmosphere delays GPS signals, adding slightly to the calculated distances between satellites and receivers. Signals from satellites close to the horizon are delayed the most since they pass through more atmosphere than signals from satellites overhead.
        6. Multipath: Ideally, GPS signals travel from satellites through the atmosphere directly to GPS receivers. In reality, GPS receivers must discriminate between signals received directly from satellites and other signals that have been reflected from surrounding objects, such as buildings, trees, and even the ground. Some, but not all, reflected signals are identified automatically and rejected. Antennas are designed to minimize interference from signals reflected from below, but signals reflected from above are more difficult to eliminate. One technique for minimizing multipath errors is to track only those satellites that are at least 15° above the horizon, a threshold called the "mask angle."

        Douglas Welsh (personal communication, Winter 2001), an Oil and Gas Inspector Supervisor with Pennsylvania's Department of Environmental Protection, wrote about the challenges associated with GPS positioning in our neck of the woods: ". in many parts of Pennsylvania the horizon is the limiting factor. In a city with tall buildings and the deep valleys of some parts of Pennsylvania, it is hard to find a time of day when the constellation will have four satellites in view for any amount of time. In the forests with tall hardwoods, multipath is so prevalent that I would doubt the accuracy of any spot unless a reading was taken multiple times." Van Sickle (2005) points out, however, that GPS modernization efforts and the GNSS may well ameliorate such gaps.


        Voir la vidéo: Comment calculer la longueur des distances sur Arcgis