3 Stimmen

Umrechnung von Breitengrad/Längengrad in Entfernung

Mein Problem ist ein wenig kompliziert, entschuldigen Sie bitte, wenn meine Frage überhaupt nicht klar ist.

Ich verwende die GoogleMap v3 API. Der Benutzer kann auf die Karte klicken, um eine Markierung zu erstellen. Wenn er auf die Markierung klickt, gebe ich Breiten- und Längengradinformationen in einem Info-Fenster aus (das ist erledigt und es funktioniert).

Was ich versuche zu tun: Der Benutzer kann eine Dimension (km/Meilen) angeben und ich muss ein Rechteck der angegebenen Größe zeichnen (die erstellte Markierung sollte sich in der Mitte des Bereichs befinden). Das Problem liegt darin, dass latlng oder bounds nur Breiten- und Längengrad akzeptieren. Also versuche ich es umzuwandeln.

Hier ist der Hauptteil des Codes.

//Breitenangabe
// 1°Breite = 111,11 km
// für mich: 1 km = 0.00900 .

//Längenangabe
//1°Breite =  111,11 km * cos Breitenangabe
// für mich: 1 km = ((1/Math.cos(Breitenangabe)) /111.11)

var myBounds = new Array();

var longkm = 5;
var largkm = 2;
myBounds[0] = new google.maps.LatLngBounds(
    new google.maps.LatLng(positionmarqueur.lat()-(0.009*longkm), positionmarqueur.lng()-(Math.abs(((1/Math.cos(positionmarqueur.lat()-(0.009*longkm))) /111.11))*largkm)),
    new google.maps.LatLng(positionmarqueur.lat()+(0.009*longkm), positionmarqueur.lng()+(Math.abs(((1/Math.cos(positionmarqueur.lat()+(0.009*longkm))) /111.11))*largkm))
);

var overlay1 = new google.maps.Rectangle({
    map: map,
    bounds: myBounds[0],
    strokeColor: "green",
    strokeWeight: 1
});

var longkm = 10;
var largkm = 10;
myBounds[1] = new google.maps.LatLngBounds(
    new google.maps.LatLng(positionmarqueur.lat()-(0.009*longkm), positionmarqueur.lng()-(Math.abs(((1/Math.cos(positionmarqueur.lat()-(0.009*longkm))) /111.11))*largkm)),
    new google.maps.LatLng(positionmarqueur.lat()+(0.009*longkm), positionmarqueur.lng()+(Math.abs(((1/Math.cos(positionmarqueur.lat()+(0.009*longkm))) /111.11))*largkm))
);

var overlay2 = new google.maps.Rectangle({
    map: map,
    bounds: myBounds[1],
    strokeColor: "blue",
    strokeWeight: 1
});

Dies sollte ein 5,2 Rechteck und ein 10,10 Rechteck (also ein 10 km Quadrat) zeichnen. (zur Information: var positionmarqueur = latLng; weiter oben im Code)

Wenn ich das Ergebnis betrachte: Das erste Rechteck sieht eher wie ein 50/20 km Rechteck aus. (Habe ich einen Fehler gemacht, als ich durch 10 geteilt habe? Mit einem Faktor von 10? Ich bin nicht sehr gut in Mathematik, aber es sieht korrekt aus).

Das zweite... sieht einfach wie ein 200*40 km Rechteck aus....

Also. Wo liegt das Problem? Ist die Formel falsch? Oder bin ich einfach dumm und übersehe etwas?

Danke.

3voto

Gabriele Petrioli Punkte 182294

Der zu verwendende Algorithmus ist

  var largkm = 5,
      longkm = 10;

  var bounds = new google.maps.LatLngBounds(
    new google.maps.LatLng(positionmarqueur.lat() - ((largkm/2)/110.54), positionmarqueur.lng() - ((longkm/2)/(Math.cos(positionmarqueur.lat())*111.32))),
    new google.maps.LatLng(positionmarqueur.lat() + ((largkm/2)/110.54), positionmarqueur.lng() + ((longkm/2)/(Math.cos(positionmarqueur.lat())*111.32)))
  );

(Hinweis: Ich teile die Rechteckgröße durch 2, da wir die Grenzen vom Zentrum aus definieren)

Demo unter http://jsfiddle.net/gaby/a5QVM/


Aktualisierung

Sie sollten die Google-Geometrielibrary verwenden, die die gleiche Projektion wie die von Google Maps verwendet, sodass Transformationen genau sind. (Sie müssen die URL für die Google API ändern in http://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false)

Genauer gesagt sollten Sie die google.maps.geometry.spherical.computeOffset Methode verwenden

var rectbounds = new google.maps.LatLngBounds(
    spherical.computeOffset(spherical.computeOffset(positionmarqueur, longkm*1000/2, -90),largkm*1000/2,0),
    spherical.computeOffset(spherical.computeOffset(positionmarqueur, longkm*1000/2, 90), largkm*1000/2,180)
);

Aktualisierte Demo unter http://jsfiddle.net/a5QVM/10/
(die *1000 ist, um die Entfernung in Meter umzuwandeln, da dies von der computeOffset Methode erwartet wird)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X