4

Angenommen, ich habe eine Reihe von Ergebnissen aus einer Studie über das Verhalten eines bestimmten Zugvogel. Der Vogel wurde markiert, und ein GPS-Empfänger zeichnet den Migrationspfad auf, den er jedes Jahr über einen Zeitraum von fünf Jahren verfolgt. Die Ergebnisse werden in einer SQL Server-Tabelle gespeichert, die eine geografische Linienfolge für den Pfad jedes Jahres enthält.Wie man zwei oder mehr Geografie-Linienfolgen mit C#/SQL Server 2008 räumlich "durchschnitt"

Wie würden Sie die Linienfolge definieren, die den "durchschnittlichen" Pfad darstellt, der über den Zeitraum von fünf Jahren verfolgt wurde?

Beachten Sie, dass jede Beispiellinienfolge eine andere Anzahl von Punkten enthalten kann. Sie beginnen und enden auch nicht an genau denselben Punkten.

Der beste Ansatz, den ich bisher habe, ist die Verwendung von Interpolation, um die Punkte in bestimmten festgelegten Proportionen entlang jeder Linienfolge zu bestimmen. So zum Beispiel der Startpunkt, ein Viertel des Weges entlang, auf halbem Weg entlang jeder Route usw. Dann berechnen Sie den mittleren Durchschnittswert lat/long dieser Positionen auf allen Routen und konstruieren Sie eine neue geografische Linienfolge aus diesen gemittelten Punkten.

Ich habe in ein paar Computergestützte Geometriebücher geschaut, um zu sehen, ob es einen bekannteren Algorithmus oder eine bessere Technik dafür gibt, aber es scheint nichts Relevantes zu geben. Ich kann nicht glauben, dass es nicht etwas ist, das jemand anderes vorher noch nicht gemacht hat ...

Ich brauche keinen genauen Code - nur Vorschläge für bessere allgemeine Ansätze. Ich brauche auch keine "Super-Genauigkeit". Als eine Nebenbemerkung würde ich idealerweise wie der Ansatz auch auf zwei oder mehr Polygone anwendbar sein.

Vielen Dank für Anregungen!

Antwort

2

Ich kann nicht wirklich einen Beispielcode schreiben, wie ich jetzt von meinem iPhone arbeite, aber ich habe einen Vorschlag (weiß nicht, ob es gut oder schlecht ist) ...

Für jede Zeile , Bestimmen Sie die Position jedes Scheitelpunktes (Prozentsatz) entlang der Linie.

Nachdem Sie diese Werte pro Zeile erhalten haben, berechnen Sie neue Scheitelpunkte entlang jeder Zeile mit allen Prozentwerten der OTHER-Zeilen.

An dieser Stelle sollte jede Zeile die gleiche Anzahl von Scheitelpunkten enthalten und der N-te Scheitelpunkt jeder Zeile entspricht direkt dem N-ten Scheitelpunkt jeder anderen Zeile.

Jetzt nur Durchschnitt Scheitelpunkt 0 für jede Linie, um den Scheitelpunkt 0 der "gemittelten" Linie zu erhalten. Wiederholen Sie dies für Vertex1 jeder Linie usw.

Dies sollte für Linien und Polygone funktionieren.

Beachten Sie, dass Sie auch einen gewichteten Mittelungsalgorithmus verwenden können, wenn Sie für jede Linie einen Genauigkeitswert ermitteln können. In der Vergangenheit habe ich diesen Ansatz verwendet, als ich versuchte, zwei Zeilen zu mitteln. Wir hatten die Möglichkeit, jede Zeile zu gewichten, typischerweise 50:50, aber sie konnten den ganzen Weg auf 100: 0 oder 0: 100 gehen, abhängig von der Genauigkeit der Quellen.

Ich ging zurück und las Ihre Frage erneut und sah, dass Sie bereits über Interpolation gesprochen haben. Die Art und Weise, wie Sie darüber gesprochen haben, scheint so zu sein, als könnten Sie die Linien glätten oder verallgemeinern, bevor Sie die Mittelwerte der interpolierten Punkte berechnen (die festen Intervallpunkte).Mit meinem Ansatz würden Sie zuerst jede Linie verdichten und dann die Durchschnittswerte berechnen. Es scheint, als ob das genauer sein könnte, aber vielleicht nicht.

+0

Ich sehe: selektiv jede Linie verdichten, bis sie alle die gleiche Anzahl von Ankerpunkten bei der gleichen relativen Abstand, dann berechnen Sie die mittlere Position für jeden Ankerpunkt. Ich mag es - danke! –

+0

Viel Glück, ich hoffe, es funktioniert für Sie. – wageoghe

0

Ich schlage vor, dass Sie lineare Regression auf die bekannten Punkte anwenden. Das wird die durchschnittliche Gerade durch sie geben.

+0

keine Art von Regression würde mit erfordern, dass ich eine Annahme über die zugrundeliegende Verteilung der Daten haben? Im Fall der linearen Regression würde diese Annahme sein, dass die Punkte in meinen Linienzügen in einer geraden Linie liegen, was sie nicht tun ... oder habe ich Ihren Vorschlag missverstanden? –

+0

Nun, Ihre Frage besagt, dass Sie den "durchschnittlichen" Weg wollen. Sie haben es also mit Statistiken zu tun. Um einen Durchschnittswert zu erhalten, müssen Sie eine lineare Regression, ein bewegliches Polynom usw. verwenden. Alles, was ich sage, ist eins auszuwählen, füttern Sie Ihre Linienstreichpunktkoordinaten hinein und Sie erhalten die Koordinaten für die resultierende Linienfolge, die Sie wünschen. – IamIC

+0

Tut mir leid, aber ich habe immer noch ein paar Probleme damit, Ihren Vorschlag zu verstehen ... Die Regressionsanalyse wird mir erlauben, einen glatten "Durchschnitt" von einer der einzelnen Linienfolgen zu erhalten, aber was ich versuche, ist die "durchschnittliche" Form aller Linienzüge. Hinweis Ich verwende absichtlich _ "Durchschnitt" _ anstatt _Average_, da ich mir des geometrisch korrekten Begriffs nicht sicher bin! –

1

Ok, ich habe hier alles nochmal gelesen und mir das Bild angesehen. Es gibt nur einen Weg, dies wirklich zu tun, und es wurde etwas gesagt. Sie müssen Ihr Sampling normalisieren und dann wenden Sie eine moving polynomial durchschnittliche Formel auf die n Ergebnisse.

Die Mathematik, um dies richtig zu tun, ist intensiv, was uns auf die Frage bringen, was Sie Geschwindigkeitsanforderungen sind?

Die Formeln für die Interpolation sind hier: http://en.wikipedia.org/wiki/Interpolation

Sobald Sie normalisiert oder haben „neu gestaltet“ jede Zeile in eine vorbestimmte Abtastrate, können Sie sie dann im Durchschnitt können.

Werfen Sie einen Blick auf diese Antwort zu: Which algorithm can efficiently find a set of points within a certain distance of a path?

+0

Ich schlage auch vor, dass Sie sich hier umsehen: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe#MSSQL – IamIC

Verwandte Themen