Ich weiß, dass diese Methode existiert und dokumentiert ist, aber ich weiß nicht, wie man ein MapCanvasProjection-Objekt bekommt.So rufen Sie vonLatLngToDivPixel in Google Maps API V3 auf?
Antwort
Blick auf http://qfox.nl/notes/116
var overlay = new google.maps.OverlayView();
overlay.draw = function() {};
overlay.setMap(map);
var point = overlay.getProjection().fromLatLngToDivPixel(latLng);
hässliche Tat. Viel einfacher in v2 - ein weiterer Fehler von Google API v3!
Um eine MapCanvasProjection erhalten Sie eine Klasse von OverlayView und rufen Sie die getProjection() -Methode, die MapCanvasProjection Typ ableiten könnte
onAdd() zeichnen() und onRemove() muss implementiert werden, von Overlay gibt eine abzuleiten.
function MyOverlay(options) {
this.setValues(options);
var div = this.div_= document.createElement('div');
div.className = "overlay";
};
// MyOverlay is derived from google.maps.OverlayView
MyOverlay.prototype = new google.maps.OverlayView;
MyOverlay.prototype.onAdd = function() {
var pane = this.getPanes().overlayLayer;
pane.appendChild(this.div_);
}
MyOverlay.prototype.onRemove = function() {
this.div_.parentNode.removeChild(this.div_);
}
MyOverlay.prototype.draw = function() {
var projection = this.getProjection();
var position = projection.fromLatLngToDivPixel(this.getMap().getCenter());
var div = this.div_;
div.style.left = position.x + 'px';
div.style.top = position.y + 'px';
div.style.display = 'block';
};
dann, wenn Sie Ihre Karte
var OverLayMap = new MyOverlay({ map: map });
Für V2 sind die Schaffung sollten Sie in der Lage sein fromLatLngToDivPixel von Ihrem GMap2 Instanz anrufen
var centerPoint = map.fromLatLngToDivPixel(map.getCenter());
Mischen Sie nicht die API v2 mit v3? –
Diese sind von V3 –
Jetzt mit Ihrer letzten Bearbeitung ist es in Ordnung –
var map;
// Create your map
MyOverlay.prototype = new google.maps.OverlayView();
MyOverlay.prototype.onAdd = function() { }
MyOverlay.prototype.onRemove = function() { }
MyOverlay.prototype.draw = function() { }
function MyOverlay(map) { this.setMap(map); }
var overlay = new MyOverlay(map);
var projection = overlay.getProjection();
Ich habe diesen Code ausprobiert, und die variable Projektion scheint "undefiniert" zu sein. Irgendeine Idee warum? Vielen Dank! – LaundroMat
Hinweis: (und das hielt mich für eine gute halbe Stunde) - stellen Sie sicher, das Overlay beim Erstellen der Karte zu erstellen, und nicht, wenn Sie die Koordinaten benötigen (via fromLatLngToDivPixel). Wenn Sie dies tun, erhalten Sie Uncaught TypeError: Die Methode 'fromLatLngToDivPixel' von undefined kann nicht aufgerufen werden. Es sieht so aus, als ob Google einige dieser Dinge asynchron ausführt. – AlexeyMK
der Code kann viel vereinfacht werden, siehe meine Antwort – TMS
I wasn bin mit den Antworten hier zufrieden. Also habe ich ein paar Experimente gemacht und die "einfachste" Arbeitslösung gefunden, die Ralphs Antwort nahe kommt, aber hoffentlich verständlicher ist. (Ich wünsche Google diese Funktion besser zugänglich macht!)
Zuerst erklären Sie eine Unterklasse von OverlayView
irgendwo in etwa so:
function CanvasProjectionOverlay() {}
CanvasProjectionOverlay.prototype = new google.maps.OverlayView();
CanvasProjectionOverlay.prototype.constructor = CanvasProjectionOverlay;
CanvasProjectionOverlay.prototype.onAdd = function(){};
CanvasProjectionOverlay.prototype.draw = function(){};
CanvasProjectionOverlay.prototype.onRemove = function(){};
Dann woanders in Ihrem Code, wo Sie die Karte instanziiert, auch instanziiert diese Overlay und legen Sie seine Karte, etwa so:
var map = new google.maps.Map(document.getElementById('google-map'), mapOptions);
// Add canvas projection overlay so we can use the LatLng to pixel converter
var canvasProjectionOverlay = new CanvasProjectionOverlay();
canvasProjectionOverlay.setMap(map);
Dann, wann immer Sie fromLatLngToContainerPixel
verwenden müssen, können Sie dies nur tun:
canvasProjectionOverlay.getProjection().fromLatLngToContainerPixel(myLatLng);
Beachten Sie, dass, weil die MapCanvasProjection Objekt ist nur verfügbar, wenn draw()
genannt wird, die irgendwann vor der idle
der Karte ist, schlage ich vor, ein boolean „mapInitialized“ Flag erstellen, legen Sie es auf der ersten Karte idle
Rückruf zu wahren. Und dann tun Sie, was Sie erst danach tun müssen.
Ich denke, der einfachste Weg besteht darin, Googles Wunsch zu ignorieren, unser Leben zu erschweren, indem nützliche Funktionen entfernt und versteckt werden, anstatt neue hinzuzufügen und nur eigene Methoden zu schreiben, die dasselbe tun.
Hier ist eine Version einer Funktion jemand woanders gebucht (ich kann es jetzt nicht finden), die für mich gearbeitet:
fromLatLngToPixel: function (position) {
var scale = Math.pow(2, Map.getZoom());
var proj = Map.getProjection();
var bounds = Map.getBounds();
var nw = proj.fromLatLngToPoint(
new google.maps.LatLng(
bounds.getNorthEast().lat(),
bounds.getSouthWest().lng()
));
var point = proj.fromLatLngToPoint(position);
return new google.maps.Point(
Math.floor((point.x - nw.x) * scale),
Math.floor((point.y - nw.y) * scale));
},
Jetzt können Sie es jederzeit anrufen und jeder, wo Sie wollen. Ich brauchte es vor allem für benutzerdefinierte Kontextmenüs, und es funktioniert perfekt.
EDIT: Ich schrieb auch eine umgekehrte Funktion, fromPixelToLatLng, die genau das Gegenteil der Fall ist. Es basiert einfach auf dem ersten, mit ein paar Mathe angewendet:
fromPixelToLatLng: function (pixel) {
var scale = Math.pow(2, Map.getZoom());
var proj = Map.getProjection();
var bounds = Map.getBounds();
var nw = proj.fromLatLngToPoint(
new google.maps.LatLng(
bounds.getNorthEast().lat(),
bounds.getSouthWest().lng()
));
var point = new google.maps.Point();
point.x = pixel.x/scale + nw.x;
point.y = pixel.y/scale + nw.y;
return proj.fromPointToLatLng(point);
}
- 1. Google Maps JavaScript API v3
- 2. Google Maps API v3 BrowserIsCompatible
- 3. Google Maps API v3: Zeichnungsmanager
- 4. So zeigen Sie Stadtgrenzen mit Google Maps API V3
- 5. Google Maps API v3 Markerkoordinaten
- 6. Google Maps API v3: So entfernen Sie einen Ereignis-Listener?
- 7. Google Maps API v3 Gemeindegrenze
- 8. Wie baue ich so etwas in Google Maps V3 API?
- 9. Google Maps API V3 Graue Bereiche
- 10. Google Maps Api v3 - getBounds ist undefined
- 11. Erlaubt Google Maps API v3 größere Zoomwerte?
- 12. Google Maps API V3 - Benutzerdefinierte Fliesen
- 13. Google Maps v3 API mouseover mit Polygonen?
- 14. Google Maps v3 Fehler
- 15. jqtouch/google maps api v3 ausgabe
- 16. Problem mit Google Maps API v3
- 17. Geocode in Google Maps v3
- 18. Google Maps API v3 addDomListener-Methode Fragen?
- 19. Google Maps API v3: Kartentyp ändern Ereignis
- 20. Google maps api v3 Suchpolygon ohne Mausereignisse
- 21. Google Maps API v3 Problem mit Firefox
- 22. google maps api v3 keine etiketten?
- 23. Google Maps v3 API - Auto Complete (Adresse)
- 24. Google Maps API V3-Methode fitBounds()
- 25. Google Maps Api v3, benutzerdefiniertes Cluster-Symbol
- 26. Google Maps API V3 - Markieren Sie eine einzelne Straße/Straße
- 27. Zugriff auf ExtendedData-Informationen über Google Maps API v3
- 28. ein .gif Bild auf Google Maps API v3 drehen?
- 29. Forcing Tile Styling auf Google Maps API für Javascript V3
- 30. Einzelkachel WMS-Layer auf Google Maps api v3
Das funktioniert zunächst perfekt für mich, aber wenn ich die Karte schwenken, werden die Pixelpositionen nicht aktualisiert. Aber wenn ich dann den Zomm-Level ändere, funktioniert es wieder wie erwartet (bis zum nächsten Pan). Fehle ich etwas? –
In Bezug auf den vorherigen Kommentar löste die Verwendung von fromLatLngToContainerPixel anstelle von fromLatLngToDivPixel mein Problem mit Pixelpositionen, die nach dem Verschieben der Karte nicht aktualisiert wurden. –
['google.maps.MapCanvasProjection' Objektspezifikation, die die Methode' fromLatLngToContainerPixel (latLng: LatLng) '' (https://developers.google.com/maps/documentation/javascript/reference?csw=1#MapCanvasProjection) enthält – user664833