Umkreisberechnung
steve!
- php
Hallo!
Ich möchte berechnen, ob ein Standpunkt, angegeben durch Geokoordinaten, im Umkreis von einem anderen Standpunkt liegt.
Also ich habe Standort X und will wissen, ob ich mich mit meinem Standpunkt Y im Radius von 5m um Standort X befinde.
Was ich nicht wissen/ berechnen will ist, wie weit die beiden Punkte auseinanderliegen.
Geht das überhaupt zu berechnen? Und wenn ja, wie wäre der Ansatz?
Danke!
Tach!
Also ich habe Standort X und will wissen, ob ich mich mit meinem Standpunkt Y im Radius von 5m um Standort X befinde.
Was ich nicht wissen/ berechnen will ist, wie weit die beiden Punkte auseinanderliegen.
Wenn die Punkte weniger als $radius auseinander liegen befindet sich Y im Umkreis von X. Was gefällt dir denn an der Abstandsberechung nicht?
Geht das überhaupt zu berechnen? Und wenn ja, wie wäre der Ansatz?
Suchmaschine mit "point inside circle" füttern.
dedlfix.
Danke euch allen, habe das Problem gelöst und ihr hattet natürlich recht, den Abstand muß man schon irgendwie berechnen.
Ich ging davon aus, dass ich eine Art Außengrenze berechnen kann, wo ich dann sowas abfragen kann wie "...WHERE LonLat IN [border]".
Schönes Wochenende euch allen!
Danke euch allen, habe das Problem gelöst und ihr hattet natürlich recht, den Abstand muß man schon irgendwie berechnen.
Vergiss dabei nicht, dass du hier nicht den Abstand zweier Punkte auf einer Ebene berechnen willst (Satz des Pythagoras) sondern (der Einfachheit halber) die kürzeste Entfernung zweier Punkte auf einer Kugel (Orthodrome also Teilstücke von Großkreisen).
Om nah hoo pez nyeetz, steve!!
Ich möchte berechnen, ob ein Standpunkt, angegeben durch Geokoordinaten, im Umkreis von einem anderen Standpunkt liegt.
Also ich habe Standort X und will wissen, ob ich mich mit meinem Standpunkt Y im Radius von 5m um Standort X befinde.
Was ich nicht wissen/ berechnen will ist, wie weit die beiden Punkte auseinanderliegen.
Doch, genau das möchtest du wissen. Wenn die Entfernung vom Punkt Y zum Punkt X größer als 5m ist, befindest du dich außerhalb des 5m-Radius.
Matthias
Hallo!
Ich möchte berechnen, ob ein Standpunkt, angegeben durch Geokoordinaten, im Umkreis von einem anderen Standpunkt liegt.
was hältst du davon:
distance = acos(sin(bl=deg2rad(bb))*sin(al=deg2rad(ba))+cos(bl)*cos(al)*cos(deg2rad(lb)-deg2rad(la)))*6380;
ba= breite a
la= länge a
bb= breite b
lb= länge b
das sind LON-LAT koordinaten. aus dieser formel kannst du alles ableiten was du benötigst.
korrigiere:
distance = acos(sin(bl=deg2rad(bb))*sin(al=deg2rad(ba))+cos(bl)*cos(al)*cos(deg2rad(lb)-deg2rad(la)))*6380;
la, ba
lb, bb
bl und al sind die ergebnisse.
was hältst du davon:
Das hält sich hartnäckig :)
distance = acos(sin(bl=deg2rad(bb))*sin(al=deg2rad(ba))+cos(bl)*cos(al)*cos(deg2rad(lb)-deg2rad(la)))*6380;
Prinzipiell ist die Formel nicht falsch, was mich hier stört sind die 6380 und die "Kommentarlosigkeit" hier ist eine Kopie der Funktion ich in einer meiner Kartenanwendungen verwende (kommentiert):
/**
* Calculation of distance of two points on earth
*
* @param array(float,float) $origin latitude and longitude of origin point
* @param array(float,float) $destination latitude and longitude of destination point
* @param float $factor calculation is done in meters, the default factor is 0.001 which results in an output in km (m·10^3)
*
* @return The calculated distance in the given unit
*/
function calc_distance($origin = array(0, 0), $destination = array(0, 0), $factor = 0.001) {
// 0 = lat; 1 = lon
$earth_radius = 6371000.785; // Average earth radius in metre (GRS 80, WGS84 ellipsoid)
$distance = $earth_radius * acos(sin(deg2rad($origin[0])) * sin(deg2rad($destination[0])) + cos(deg2rad($origin[0])) * cos(deg2rad($destination[0])) * cos(deg2rad($origin[1] - $destination[1])));
return (float)$distance * $factor;
}
Per Vorgabe gibt die Funktion die Distanz in km aus (Faktor 0,001) - intern berechnet wird aber in SI-Einheiten.
Der Erdradius wird hierbei nicht mit 6380 km angegeben (wo dieser Wert herkommt, war mir nie sonderlich klar - sogar der Radius am Äquator ist kleiner) sondern per Definition aus WGS84 - das ist zwar bei der Entfernungsberechnug zwischen zwei nahe zusammenliegenden Orten weitgehend vernachlässigbar, bei Transatlantikflügen kommen da aber schon recht große Abweichungen zusammen.
Der Erdradius wird hierbei nicht mit 6380 km angegeben (wo dieser Wert herkommt, war mir nie sonderlich klar - sogar der Radius am Äquator ist kleiner) sondern per Definition aus WGS84 - das ist zwar bei der Entfernungsberechnug zwischen zwei nahe zusammenliegenden Orten weitgehend vernachlässigbar, bei Transatlantikflügen kommen da aber schon recht große Abweichungen zusammen.
Nachtrag: oft wird in Berechnungena auch die große Halbachse (also der Äquatorradius verwendet) - das wären dann 6378 km - der Radius an den Polen beträgt nur rund 6357 km.
Der von mir angegbenen mittlere Erdradius ist das arithmetische Mittel von Volumengleichen Kugeln über die große und kleine Halbachse.
Diesen Wert verwendet z.B. auch das Statistische Bundesamt für die Berechnung von Flugstrecken über deutschem Luftraum: Seite 11
Nachtrag: oft wird in Berechnungena auch die große Halbachse (also der Äquatorradius verwendet) - das wären dann 6378 km - der Radius an den Polen beträgt nur rund 6357 km.
Der von mir angegbenen mittlere Erdradius ist das arithmetische Mittel von Volumengleichen Kugeln über die große und kleine Halbachse.
Noch ein Nachtrag, nochmal duchgerechnet mit cuberoot(a²b):
GRS80
a = 6378137
b = 6356752,314140
6371000,789974
WGS84
a = 6378137
b = 6356752,314245
6371000,790009
Woher das statististische Bundesamt die .785 her hat, ist mir nicht so ganz klar :)
Hi,
6371000,789974
6371000,790009Woher das statististische Bundesamt die .785 her hat, ist mir nicht so ganz klar :)
Das wird ein älterer Wert sein - durch die Erderwärmung ist die Erde inzwischen etwas größer geworden ;-)
cu,
Andreas
Woher das statististische Bundesamt die .785 her hat, ist mir nicht so ganz klar :)
Das wird ein älterer Wert sein - durch die Erderwärmung ist die Erde inzwischen etwas größer geworden ;-)
Ich glaub' das eher mit dem geistigen Dünnpfiff zu tun, der sich auf der Erdoberfläche verteilt :)
... was mich hier stört sind die 6380 ...
jetzt müssen wir nur noch berechnen um wie viel sich die erde bei mondumkreisungen verformt und das in relation zur uhrzeit und zu den koordinaten bringen. und verwerfungen durch tektonische plattenverschiebungen, das macht sicher auch noch ein paar meter aus.
Tach!
... was mich hier stört sind die 6380 ...
jetzt müssen wir nur noch berechnen um wie viel sich die erde bei mondumkreisungen verformt und das in relation zur uhrzeit und zu den koordinaten bringen. und verwerfungen durch tektonische plattenverschiebungen, das macht sicher auch noch ein paar meter aus.
Tja, da verfängt sich der suit in seinen Betrachtungen an den verschiedenen Erdumfang-Werten und übersieht dabei ganz die Höhenunterschiede im lokalen Bereich. Dabei hatte der OP als Beispiel grad mal 5 Meter Umkreis angegeben.
dedlfix.
Tja, da verfängt sich der suit in seinen Betrachtungen an den verschiedenen Erdumfang-Werten und übersieht dabei ganz die Höhenunterschiede im lokalen Bereich.
Die lokalen Höhenunterschiede sind für ein Referenzmodell nicht relevant da die Berechnung anhand der mittleren Halbachsen (die die Höhenunterschiede beinhalten) auf eine Kugel umgelegt wird. Was für GPS gut ist, wird für uns wohl gut genug sein?
Dabei hatte der OP als Beispiel grad mal 5 Meter Umkreis angegeben.
Ich gehe davon aus, dass das ein Tippfehler des OP ist und beim Kontext "Geokoordinaten" eher mindestens 5 km gemeint sind :)
... was mich hier stört sind die 6380 ...
jetzt müssen wir nur noch berechnen um wie viel sich die erde bei mondumkreisungen verformt und das in relation zur uhrzeit und zu den koordinaten bringen. und verwerfungen durch tektonische plattenverschiebungen, das macht sicher auch noch ein paar meter aus.
Die 9 km Differenz beim Radius machen bei der Strecke Wien - Paris gut 1,5 km aus, bei Wien - New York sind es schon 11 km
Nachdem GSP sich auf das WGS84-Ellipsoid verlässt, gibt es keinen Grund für Entfernungsberechnungen hier nicht zumindest denselben Wert für die große Halbachse zu verwenden.
GPS vernachlässtigt die Änderung der Abplattung der Erde durch die Gezeiten, weil sich dadurch nur die Form der Erde ändern, nicht aber die des Referenzellipsoides.
Für unsere Berechnung ist ist das auch bei weiten nicht so ausschlaggebend: selbst bei Neumond ändert sich der Radius am Äquator nur um etwa 0,5 Meter - auf die Strecke Wien - New York gerechnet wäre das eine Abweichung von etwa 35 cm
Die Plattenverschiebung selbst ist für die Berechnung in GPS nicht direkt relevant, GPS liefert nur Koordinaten im WGS84 Referenzellipsoid. Wo diese Punkte liegen ist erstmal egal, da davon ausgeangen wird dass die Punkte ohnein bei Bedarf gemessen werden. In unserem Fall haben wir die Koordinaten natürlich statisch vorliegen und wenn diese schon ein paar Jahre alt sind, sind sie jetzt schlichtweg nicht mehr korrekt.
Das führt zu seltsamen Erscheinungen wie z.B. der Tatsache dass der Nullmeridian in Greenwich (zur Zeit) etwa 100 Meter von seiner eigentlich Position entfernt ist, da dieser gesetzt wurde, als man noch davon ausging dass die Erde eine Kugel wäre.
Nachdem sich die Eurasische Platte etwa um 2,5 cm pro jahr verschiebt, wird der Nullmeridian in Greenwich also immer weiter vom praktischen Nullmeridian abweichen.
GPS nutzt als Basis eben WGS84 - als Referenzpunkte dienen hier der Erdmittelpunkt (+/- 2 cm) sowie der IERS Referenz Meridian. Dieser Referenzmeridian ist an keinen Einzelpunkt gebunden sondern wird aus der Entfernung hunderten Einzelpunkte weltweit bestimmt und ist somit keinen Fixpunkt auf der Erde zugeordnet.
Diese Fixpunkte werden in GPS (bzw. WGS84) regelmäßig neu bestimmt und mit Koordinaten hinterlegt - die letzte Anpassung dieser Daten war 2004.
Kurzum: mir ging es um die 6380 km - die liest man immer wieder aber sie waren noch nie "richtig" man wusste bereits vor ein paarhundert Jahren, dass der mittlere Äquatorradius 6378 km beträgt :)
Hallo steve!,
Also ich habe Standort X und will wissen, ob ich mich mit meinem Standpunkt Y im Radius von 5m um Standort X befinde.
Was ich nicht wissen/ berechnen will ist, wie weit die beiden Punkte auseinanderliegen.
das mag sein, berechnen musst du es aber trotzdem. :)
Geht das überhaupt zu berechnen? Und wenn ja, wie wäre der Ansatz?
Wikipedia weiß Rat: Orthodrome
Gruß, Jürgen
Ich möchte berechnen, ob ein Standpunkt, angegeben durch Geokoordinaten, im Umkreis von einem anderen Standpunkt liegt.
Vermutlich kommen Deine Daten aus einer Datenbank mit vielen Orten.
Mein Rat: Gehe mehrstufig vor.
Ermittle zunächst alle Orte aus der Datenbank, die innerhalb des durch die maximale Abweichung von Ausgangsort bestimmten VIERECKS liegen. Das ist eine realtiv simple Operation, du kannst also für Länge und Breite je einen minimalen und maxinalen Wert vorberechnen.
Damit hast folgende, einfache Abfrage:
select
orte #wasauchimmer
from
tabelle
where
lat <= lat_min
and lat >= lat_max
and long <= long_min
and long >= long_max
Dann erittle in einem zweiten Durchgang (das kann eine Abfrage aus einer temporären Tabelle oder in der "umgebenden" Programmiersprache sein) für jeden dieser Orte die genaue Entfernung zum Ausgangsort z.B. mit Gustls Formel (für die ich mich jetzt mal nicht verbürge) und bestimme so, ob der Radius passt.
Es wird die Datenbank ganz wesentlich entlasten, wenn nicht grundlos so relativ aufwendige Berechnungen angestellt werden müssen.
Du kannst Dir die Geschwindigkeit ja mal in diesem uralten Projekt ansehen.
Mein Rat: Gehe mehrstufig vor.
Das kommt auf die Datenmenge drauf an :)
Dass man hier mit einer Bounding-Box arbeitet um eine schnelle Näherung zu erreichen ist idR. kein schlechter Ansatz, ist aber wenigen tausend Einträgen eine Fleißaufgabe.
Also ich habe Standort X und will wissen, ob ich mich mit meinem Standpunkt Y im Radius von 5m um Standort X befinde.
Was ich nicht wissen/ berechnen will ist, wie weit die beiden Punkte auseinanderliegen.
Wenn Du solche Geoberechnungen öfter hast solltest Du Dir mal überlegen, ob Du nicht mit PostgreSQL und der räumlichen Erweiterung Postgis arbeitest.
Da kannst Du solche Fragestellungen einfach via SQL abfeiern und hast alle Möglichkeiten der Welt.
Z.B. Buffer oder Intersection
Gruß Sven