Beachten Sie, dass GoogleMap.getProjection in der Android-API von Google Maps kein Singleton ist

Dies ist die Geschichte der Google Maps Android-API, die bei der Verwendung von Google Maps unter Android verwendet wird.

Eine der Funktionen dieses SDK ist die "gegenseitige Konvertierung zwischen Kartenkoordinaten (Breiten- und Längengrad) und Bildschirmkoordinaten". Mit diesem,

Rufen Sie dazu "fromScreenLocation" oder "toScreenLocation" mit einer Instanz der "Projection" -Klasse in "GoogleMap.getProjection ()" auf.

Fühlt es sich nicht wie die Instanz an, die Sie mit dieser "GoogleMap.getProjection ()" -, einzelnen Tonne oder derselben Instanz erhalten können, wann immer Sie sie erhalten? Wie bei GoogleMap.getUiSettings (). Das Schreiben von map.getProjection (). FromScreenLocation ist langweilig. Möchten Sie es also nur einmal abrufen, wenn Sie eine Karte erstellen und wiederverwenden?

private Projection _proj;

@Override
public void onMapReady (GoogleMap map) {
    //Es gab eine Zeit, in der ich dachte, ich sollte es zuerst bekommen und wiederverwenden ...
    _proj = map.getProjection();
}

Dies ist jedoch ein Fehler.

Als Versuch schreibe ich: "Wenn sich die Position der Karte ändert, ermitteln Sie den Breiten- und Längengrad oben links (0, 0) des Bildschirms."

private Projection _proj;

@Override
public void onMapReady (GoogleMap map) {
    //Es gab eine Zeit, in der ich dachte, ich sollte es zuerst bekommen und wiederverwenden ...
    _proj = map.getProjection();

    //Ereignis, wenn die Kamera vollständig bewegt und im Leerlauf ist (mit RetroLambda)
    map.setOnCameraIdleListener(() -> {
        //Ermitteln Sie den Breiten- und Längengrad des Bildschirmursprungs
        LatLng latlng = _proj.fromScreenLocation(new Point(0, 0));
        Log.d("TEST", "lat:" + latlng.latitude + ", long:" + latlng.longitude); 
    });
}

Durch Scrollen der Karte wird der Handler für "setOnCameraIdleListener" aufgerufen, aber ich erhalte nicht die erwarteten Ergebnisse. Ich denke, es ist wahrscheinlich minus oder nahe Null.

Um das richtige Ergebnis zu erhalten

map.setOnCameraIdleListener(() -> {
    //Ermitteln Sie den Breiten- und Längengrad des Bildschirmursprungs
    Projection prj = map.getProjection();
    LatLng latlng = prj.fromScreenLocation(new Point(0, 0));
    Log.d("TEST", "lat:" + latlng.latitude + ", long:" + latlng.longitude); 
});

Sie müssen eine "aktuelle" Projektion-Instanz erhalten, wie z.

Schauen wir uns nun die API-Referenzbeschreibung an.

The Projection returned is a snapshot of the current projection, and will not automatically update when the camera moves. As this operation is expensive, you should get the projection only once per screen. Google Maps uses the Mercator projection to create its maps from geographic data and convert points on the map into geographic coordinates.

The Projection returned is a snapshot of the current projection, and will not automatically update when the camera moves.

Es wurde fest geschrieben!

Die Projektion ist eine Projektionsmethode (Mercator-Projektion), und da die Projektionsmethode (= Formel für die Projektion) unveränderlich ist, hätte ich nicht gedacht, dass bei jeder Aufnahme ein Schnappschuss erstellt wird. Ich bemerkte dieses Verhalten nicht und machte mir etwa 3 Stunden lang Sorgen.

Die Lektion war, wenn Sie besorgt waren, lassen Sie uns die Stereotypen wegwerfen und Kihon überprüfen. Wenn ich es jedoch wage zu sagen, dass der Methodenname so etwas wie "getCurrentProjection ()" war, war es möglicherweise nicht die Idee, "ihn zuerst zu bekommen und wieder zu verwenden". Als Person, die SDK erstellt, wollte ich über eine Namensgebung nachdenken.

Recommended Posts

Beachten Sie, dass GoogleMap.getProjection in der Android-API von Google Maps kein Singleton ist
Erstellen Sie eine Tweet-Heatmap mit der Google Maps-API
Informationen zum Kamerawechselereignis der Google Maps Android API
[Google Maps API] Karte wird nicht angezeigt und wird leer [Rails]
Klasse, die die API von DMM trifft
Suchen Sie in Google Earth nach einem Gebäude, das der Höhe von Shin Godzilla entspricht
Es gibt ein Muster, das das Programm bei Verwendung von Python-Threading nicht gestoppt hat
Gründliche Effizienzsteigerung! Der Name ist nicht die einzige "Kurzschlussentwicklung", die einen coolen Namen hat.
Die Geschichte, dass pyenv den Python-Ausführungsbefehl PATH nicht bestanden hat
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
Erstellen eines Python-Skripts, das die e-Stat-API unterstützt (Version 2)
Gibt es eine Verzerrung in den Zahlen, die in den Fibonacci-Zahlen erscheinen?
Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
[Kartenanzeige] Zeigen Sie eine Karte anhand der vom Benutzer registrierten Adresse mit der JavaScript-API und der Geokodierungs-API von Google Maps an!
Das Bild ist Namekuji
Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist
Spielen Sie Sounds in Python ab, vorausgesetzt, die Tastatur ist eine Klaviertastatur
Die Geschichte der Release-Arbeit der Anwendung, die Google nicht erzählt
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Die NVM-Prüfsumme ist ungültig, eine Lösung für das Problem, das das kabelgebundene LAN von Intel unter Linux nicht erkennt.
Das Problem, das mir Schokolade gibt, tritt nicht auf, selbst wenn die Korrespondenzanalyse mit der COTOHA-API durchgeführt wird