4

Supposons que j'ai obtenu un ensemble de résultats d'une étude sur le comportement d'un oiseau migrateur en particulier. L'oiseau a été marqué et un récepteur GPS enregistre la trajectoire de migration qu'il suit chaque année sur une période de cinq ans. Les résultats sont stockés dans une table SQL Server qui contient une chaîne de lignes géographiques pour le chemin de chaque année.Comment «mettre en moyenne» deux ou plusieurs chaînes de lignes géographiques en utilisant C#/SQL Server 2008 spatial

Comment définiriez-vous la ligne représentant la trajectoire «moyenne» suivie sur la période de cinq ans? Notez que chaque ligne échantillon peut contenir un nombre différent de points. Ils ne commencent pas et ne se terminent pas exactement aux mêmes points.

La meilleure approche que j'ai jusqu'à présent est d'utiliser l'interpolation pour déterminer les points à certaines proportions définies le long de chaque ligne. Ainsi, par exemple, le point de départ, un quart de trajet, à mi-chemin le long de chaque route, etc. Ensuite, calculez la moyenne/long moyenne de ces positions sur toutes les routes et construisez une nouvelle ligne linestring à partir de ces points moyennés.

J'ai regardé dans quelques livres de géométrie computationnelle pour voir s'il y a un algorithme ou une technique mieux connue pour faire ceci, mais il ne semble y avoir rien de pertinent. Je ne peux pas croire que ce n'est pas quelque chose que quelqu'un d'autre n'a pas fait auparavant cependant ...

Je n'ai pas besoin de code exact - juste des suggestions pour de meilleures approches générales. Je n'ai pas besoin de "super-précision" non plus. En tant que sidenote, j'aurais idéalement comme l'approche pour être applicable à deux ou plusieurs polygones aussi.

Merci pour vos suggestions!

Répondre

2

Je ne peux pas poster vraiment de code exemple que je travaille de mon iPhone en ce moment, mais j'ai une suggestion (ne sais pas s'il est bon ou mauvais) ...

Pour chaque ligne , déterminez la position de chaque sommet (pourcentage) le long de la ligne. Après avoir obtenu ces valeurs, par ligne, calculez de nouveaux sommets le long de chaque ligne en utilisant toutes les valeurs en pourcentage des AUTRES lignes. À ce stade, chaque ligne doit contenir le même nombre de sommets et le Nième sommet de chaque ligne correspond directement au Nième sommet de chaque autre ligne.

Maintenant juste le sommet moyen 0 pour que chaque ligne obtienne le sommet 0 de la ligne "moyennée". Répéter pour le vertex1 de chaque ligne, etc.

Ceci devrait fonctionner aussi bien pour les lignes que pour les polygones.

Notez que vous pouvez également utiliser un algorithme de moyenne pondérée si vous pouvez déterminer une valeur de précision pour chaque ligne. Dans le passé, j'ai utilisé cette approche en essayant de faire la moyenne de deux lignes. Nous avions la possibilité de pondérer chaque ligne, généralement 50:50, mais nous pouvions aller jusqu'à 100: 0 ou 0: 100, selon l'exactitude des sources.

Je suis retourné et j'ai relu ta question et j'ai vu que tu avais déjà parlé d'interpolation. La façon dont vous avez parlé de le faire semble pouvoir lisser ou généraliser les lignes avant de calculer les moyennes des points interpolés (les points d'intervalle fixes).Avec mon approche, vous devez d'abord densifier chaque ligne, puis calculer les moyennes. Il semble que cela pourrait être plus précis, mais peut-être pas.

+0

Je vois: densifier sélectivement chaque ligne jusqu'à ce qu'elles contiennent toutes le même nombre de points d'ancrage à la même espacement relatif, puis calculer l'emplacement moyen pour chaque point d'ancrage. J'aime ça - merci! –

+0

Bonne chance, j'espère que cela fonctionne pour vous. – wageoghe

0

Je suggère que vous appliquiez la régression linéaire aux points connus. Cela donnera la moyenne en ligne droite à travers eux.

+0

Ne serait-en utilisant toute sorte de régression exigent que j'ai une hypothèse sur la distribution sous-jacente des données? Dans le cas de la régression _linear_, cette hypothèse serait que les points de mes lignes de lignes sont en ligne droite, ce qui n'est pas le cas ... ou ai-je mal compris votre suggestion? –

+0

Eh bien, votre question indique que vous voulez le chemin "moyen". Vous avez donc affaire à des statistiques. Pour obtenir une moyenne, vous devez utiliser une régression linéaire, un polynôme en mouvement, etc. Tout ce que je dis, c'est en choisir un, y alimentez les coordonnées de vos lignes, et vous obtiendrez les coordonnées pour la ligne résultante que vous désirez. – IamIC

+0

Désolé, mais j'ai toujours un peu de mal à comprendre votre suggestion ... l'analyse de régression me permettra d'obtenir une "moyenne" lisse de l'une des lignes individuelles, mais ce que j'essaie de faire est d'obtenir le forme "moyenne" de toutes les lignes. Remarque: J'utilise délibérément _ "moyen" _ plutôt que _average_, car je ne suis pas sûr du terme géométriquement correct! –

1

Ok, j'ai relu tout ici et regardé l'image. Il n'y a qu'une façon de le faire vraiment, et cela a été dit un peu. Vous devez normaliser votre échantillonnage et puis appliquer une formule moyenne polynomiale mobile aux n résultats.

Les maths pour faire cela correctement sont intenses, ce qui nous amène à la question de ce que sont vos exigences de vitesse?

Les formules pour l'interpolation sont ici: http://en.wikipedia.org/wiki/Interpolation

Une fois que vous avez normalisé ou « re-forme » chaque ligne en un taux d'échantillonnage prédéterminé, vous pouvez en faire la moyenne.

Jetez un oeil à cette réponse aussi: Which algorithm can efficiently find a set of points within a certain distance of a path?

+0

Je vous suggère également de creuser ici: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe#MSSQL – IamIC