| Author |
Message |
![[Post New]](/gforum/templates/default/images/icon_minipost_new.gif) 25/11/2007 12:34:45
|
Jens D.
Joined: 25/11/2007 12:15:43
Messages: 2
Location: Nordhausen, Germany
Offline
|
Hallo!
Erstmal danke für diesen großartigen und dazu noch kostenlosen Service, den es hoffentlich noch lange geben wird.
Doch nun zu meiner Frage:
findNearbyPlaceName, gibt beim Style FULL auch ein Feld "bearing" aus.
Dieses soll wohl die Himmelsrichtung angeben, in der sich der Ort, aus Richtung der GPS-Koordinaten befindet.
Wird dieses Feld korrekt gebildet? Und was bedeutet die zurückgelieferte Grad-Angabe?
Im englischen Wikipedia-Artikel ist Bearing so beschreiben:
Bearings are in these terms 0°= north, 45°=Northeast, 90°= East, 135°=southeast, 180°= South, 225°= Southwest, 270°= West, 315°= Northwest and 360°= North.
Für einen Ort der Nordöstlich liegt, gibt die Datenbank aber 301.6703 zurück, was laut der oben zitierten Definition Nordwestlich wäre.
Eine Software zur Ermittlung des "Bearing", gibt 28,68° zurück - wie GeoNames auf 301.67 kommt ist mir ein Rätsel.
Teilweise wird hier auch ein Wert größer 360 zurückgegeben (z.B. 402.1893).
Leider finde ich hier auf der Seite keine Beschreibung zum Bearing, deshalb hoffe ich, mir kann hier jemand weiterhelfen.
Hier mal ein Beispiel, das beide Probleme enthält:
http://ws.geonames.org/findNearbyPlaceName?lat=26.260014&lng=-98.579807&radius=25&maxRows=20&style=FULL
Die GPS-Position befindet sich (laut GoogleMaps) süd-westlich von Cuevitas. Das Bearing ergibt wie gesagt "Nordwestlich".
Ein Stück weiter unten in der XML-Rückgabe findet sich auch das Bearing mit 402°. (name = Los Ebanos)
Danke schonmal im Voraus!
Cu, Jens
|
|
|
 |
![[Post New]](/gforum/templates/default/images/icon_minipost_new.gif) 26/11/2007 11:25:22
|
marc
Joined: 08/12/2005 07:39:47
Messages: 4501
Offline
|
Hallo Jens
Da hast Du völlig recht, da stimmt was nicht. Ich habe den Code von einem Contributor erhalten und ungetetest ins cvs gestellt :
http://geonames.cvs.sourceforge.net/geonames/geonames/java/src/org/geonames/utils/Bearing.java?sortdir=down&view=log
Wenn Du möchtest kannst du dir den Code ansehen und den Fehler korrigieren. Ich habe im Moment keine Zeit dazu. Ich habe dem Contributor auch ein Email geschickt und hoffe er hat Zeit dafür und werde die Funktion im Webservice wieder rausnehmen.
Das ist eines der Probleme mit Open source. Erstens kommen kaum Beiträge und wenn welche kommen, muss man sich um das Testing, Dokumentation und alles kümmern. Unter dem Strich hat man mehr Arbeit Ich zögere deshalb auch mehr code von GeoNames ins sourceforge csv zu stellen.
Gruss
Marc
|
 |
|
|
 |
![[Post New]](/gforum/templates/default/images/icon_minipost_new.gif) 26/11/2007 18:07:03
|
Jens D.
Joined: 25/11/2007 12:15:43
Messages: 2
Location: Nordhausen, Germany
Offline
|
Hallo Marc,
danke für deine Antwort!
Leider bin ich in Java nicht so bewandert, deshalb möchte ich in so einer zeitkritischen Anwendung wie der GeoNames-Datenbank, lieber nicht rumbasteln.
Ich kann dir allerdings meinen Visual Basic-Code zur Verfügung stellen, der das Bearing ermittelt.
Vielleicht kannst Du in einer freien Minute damit ja was Anfangen, oder jemand anderes übersetzt das in optimierter Form nach Java:
Code:
Public Function Bearing(ByRef Lat1 As Double, ByRef Lng1 As Double, ByRef Lat2 As Double, ByRef Lng2 As Double) As Double
Dim x As Double
Dim y As Double
Const PI As Double = 3.14159265358979
Const PIdiv2 As Double = PI / 2#
Const PIdiv4 As Double = PI / 4#
Const PImul2 As Double = PI * 2#
Const div180mulPI = 1# / 180# * PI ' DegToRad()
Const div180mulPIdiv2 = div180mulPI / 2# ' DegToRad() / 2
Const mul180divPI = 1# * 180# / PI ' RadToDeg()
x = Log(Tan((Lat2 * div180mulPIdiv2) + PIdiv4) / Tan((Lat1 * div180mulPIdiv2) + PIdiv4))
y = (Lng2 - Lng1) * div180mulPI
If Abs(y) > PI Then
If y > 0# Then
y = PImul2 - y
Else
y = PImul2 + y
End If
End If
' Bearing = atan2(y, x) * mul180divPI -> atan2() gibt's in VB nicht, deshalb:
If Abs(y) < 0.0000001 Then
If x < 0# Then
Bearing = 180#
'Else
' Bearing = 0#
End If
ElseIf Abs(x) < 0.0000001 Then
If y < 0# Then
Bearing = 270#
Else
Bearing = 90#
End If
Else
Bearing = Atn(y / x) * mul180divPI
If Bearing < 0# Then
If x < 0# Then
Bearing = Bearing + 180#
Else
Bearing = Bearing + 360#
End If
Else
If y < 0# Then Bearing = Bearing + 180#
End If
End If
End Function
Davon abgesehen, denke ich sollte es nicht die Aufgabe von GeoNames sein, solche Zusätzinformationen zu errechnen, die auch leicht auf dem Client ermittelt werden können. Das lastet nur unnötigt den Server aus und macht die Abfragen für alle langsamer.
Ich benötige die Style FULL-Ausgabe, da nur dort bestimmte Felder die ich brauche enthalten sind - das Bearing kann man -wenn man es benötigt- auch leicht auf dem Client selbst ermitteln. Nur meine Meinung.
Cu, Jens
|
|
|
 |
|
|
|
|