GeoNames Home | Postal Codes | Download / Webservice | About 

GeoNames Forum
  [Search] Search   [Recent Topics] Recent Topics   [Groups] Back to home page 
[Register] Register / 
[Login] Login 
bearing korrekt?  XML
Forum Index -> Forum in Deutsch
Author Message
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
[WWW]
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

[WWW]
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
[WWW]
 
Forum Index -> Forum in Deutsch
Go to:   
Powered by JForum 2.1.5 © JForum Team