Während die Standardfunktionen von Google Maps unglaublich nützlich sind, gibt es Zeiten, in denen Sie etwas mehr tun möchten. Glücklicherweise hat Google eine Open-Source-Bibliothek mit einer Reihe von Dienstprogrammen erstellt, mit denen Android-Entwickler ihre Anwendungen mit verbesserten Karten noch verbessern können.
In diesem Lernprogramm erfahren Sie, wie Sie mit dieser Dienstprogrammbibliothek Heatmap-Visualisierungen für Ihre Daten hinzufügen, eine große Anzahl von Markern für eine einfachere Anzeige zusammenstellen und verschiedene Dienstmethoden verwenden, um mit der sphärischen Natur der Erde zu arbeiten oder Routen auf Straßen zu zeichnen.
Die Quelldateien für dieses Lernprogramm finden Sie auf GitHub.
Im ersten Tutorial dieser Serie habe ich beschrieben, wie Sie ein Projekt mithilfe der Google Developer Console einrichten und Ihrem Manifest einen API-Schlüssel hinzufügen. Für dieses Lernprogramm benötigen Sie einen API-Schlüssel und richten Ihr Projekt mit einem dort beschriebenen Manifest ein.
Als nächstes öffnen build.gradle Fügen Sie zwei neue Abhängigkeiten hinzu, eine für Play Services für die Verwendung von Google Maps und eine für die Google Maps Utils-Bibliothek.
com.google.android.gms: play-services-maps kompilieren: 7.8.0 'com.google.maps.android:android-maps-utils:0.4' kompilieren
Ich sollte beachten, dass sich die Google Maps Utils-Bibliothek technisch noch in der Beta-Phase befindet, obwohl sie bereits seit zwei Jahren verfügbar ist. Nachdem Sie diese Bibliotheken importiert und das Projekt synchronisiert haben, müssen Sie die Layoutdatei für aktualisieren MainActivity.java so dass es das unten gezeigte benutzerdefinierte Fragment verwendet.
Als nächstes erstellen Sie die UtilsListFragment
Klasse, die oben verwendet wird, sodass eine einfache Liste mit Elementen angezeigt wird, die die verschiedenen Teile der Bibliothek darstellen, die Sie in diesem Lernprogramm kennen lernen.
public class UtilsListFragment erweitert ListFragment @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); ArrayAdapteradapter = new ArrayAdapter (getActivity (), android.R.layout.simple_list_item_1); String [] items = getResources (). GetStringArray (R.array.list_items); adapter.addAll (neue ArrayList (Arrays.asList (Elemente))); setListAdapter (Adapter); @Override public void onListItemClick (ListView l, Ansicht v, int position, long id) super.onListItemClick (l, v, position, id); String item = ((TextView) v) .getText (). ToString (); if (getString (R.string.item_clustering) .equalsIgnoreCase (item)) startActivity (new Intent (getActivity (), ClusterMarkerActivity.class)); else if (getString (R.string.item_heat_map) .equalsIgnoreCase (item)) startActivity (new Intent (getActivity (), HeatMapActivity.class)); else if (getString (R.string.item_polylines) .equalsIgnoreCase (item)) startActivity (new Intent (getActivity (), PolylineActivity.class)); else if (getString (R.string.item_spherical_geometry) .equalsIgnoreCase (item)) startActivity (new Intent (getActivity (), SphericalGeometryActivity.class));
Jede der Zeichenketten wird definiert und in eine Zeichenfolge eingefügt String-Array
für die Einheitlichkeit.
Clustering Heat Map Polyliniendekodierung Sphärische Geometrie Utils - @ string / item_clustering
- @ string / item_heat_map
- @ string / item_polylines
- @ string / item_spherical_geometry
Sobald Ihre Liste verfügbar ist, müssen Sie erstellen BaseMapActivity.java, Hier werden alle Einstellungen für die allgemeine Map für jede der von Ihnen erstellten Beispielaktivitäten behandelt. Diese Aktivität
initialisiert a Google Karte
und zoomt die Kamera in einen bestimmten Bereich. In diesem Fall handelt es sich um die Stadt Denver in Colorado, USA. Alles in dieser Klasse sollte aus den letzten beiden Artikeln dieser Serie bekannt sein.
Öffentliche abstrakte Klasse BaseMapActivity erweitert AppCompatActivity protected LatLng mCenterLocation = new LatLng (39.7392, -104.9903); geschützte GoogleMap mGoogleMap; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (getMapLayoutId ()); initMapIfNecessary (); @Override protected void onResume () super.onResume (); initMapIfNecessary (); protected void initMapIfNecessary () if (mGoogleMap! = null) return; mGoogleMap = ((MapFragment) getFragmentManager (). findFragmentById (R.id.map)) .getMap (); initMapSettings (); initCamera (); protected void initCamera () CameraPosition position = CameraPosition.builder () .target (mCenterLocation) .zoom (getInitialMapZoomLevel ()) .build (); mGoogleMap.animateCamera (CameraUpdateFactory.newCameraPosition (position), null); protected int getMapLayoutId () return R.layout.activity_map; protected float getInitialMapZoomLevel () return 12.0f; protected abstract void initMapSettings ();
Nachdem Sie das ursprüngliche Projekt erstellt haben, können Sie mit dem nächsten Abschnitt fortfahren, in dem Sie ein neues erstellen Aktivität
für jedes Dienstprogramm, das wir in diesem Tutorial behandeln werden.
Heat Maps sind eine hervorragende Möglichkeit, Konzentrationen von Datenpunkten auf einer Karte visuell darzustellen. Mit der Google Maps Utils-Bibliothek können Sie sie leicht zu einer Anwendung hinzufügen. Erstellen Sie zunächst ein neues BaseMapActivity
genannt HeatMapAktivität
und füge es zu deinem hinzu AndroidManifest.xml Datei. Erklären Sie oben in dieser Klasse a HeatmapTileProvider
dass wir verwenden, um die Kartenüberlagerung zu erstellen.
privater HeatmapTileProvider mProvider;
Im BaseMapActivity
, eine benannte Methode initMapSettings
heißt, dass Sie Ihre Anpassungen der Karte hinzufügen können. Dafür Aktivität
, Sie müssen diese Methode überschreiben, um eine Anordnungsliste
von LatLng
Objekte, die dann verwendet werden, um die HeatmapTileProvider
Objekt.
Der Anbieter verfügt über verschiedene Methoden, mit denen Sie das Erscheinungsbild Ihrer Heatmap ändern können, z. B. die Verlaufsfarben, den Radius für jeden Punkt und die Gewichtung jedes Punkts. Sobald Ihr Provider aufgebaut ist, können Sie die Heatmap erstellen TileOverlay
und wenden Sie es auf Ihre Karte an.
@Override geschütztes void initMapSettings () ArrayListlocations = generateLocations (); mProvider = new HeatmapTileProvider.Builder (). data (locations) .build (); mProvider.setRadius (HeatmapTileProvider.DEFAULT_RADIUS); mGoogleMap.addTileOverlay (neue TileOverlayOptions (). tileProvider (mProvider));
In der obigen Implementierung von initMapSettings
, Erzeugungspositionen
ist eine Hilfsmethode, die 1000 generiert LatLng
Positionen rund um die zentrale Kartenposition.
private ArrayListgenerateLocations () ArrayList locations = neue ArrayList (); doppeltes lat; doppelt lng; Zufallsgenerator = new Random (); für (int i = 0; i < 1000; i++ ) lat = generator.nextDouble() / 3; lng = generator.nextDouble() / 3; if( generator.nextBoolean() ) lat = -lat; if( generator.nextBoolean() ) lng = -lng; locations.add(new LatLng(mCenterLocation.latitude + lat, mCenterLocation.longitude + lng)); return locations;
Sobald Sie mit der Implementierung fertig sind initMapSettings
und Erzeugungspositionen
, Sie können Ihre App ausführen und auf den Heatmap-Abschnitt klicken, um sie in Aktion zu sehen.
Wenn sich auf einer Karte viele Datenpunkte in einem kleinen Bereich befinden, kann dies beim Herauszoomen des Benutzers sehr schnell unübersichtlich werden. Nicht nur das, auch wenn zu viele Markierungen gleichzeitig angezeigt werden, kann es bei einigen Geräten zu einer erheblichen Verlangsamung kommen.
Um die durch diese Probleme verursachte Frustration zu verringern, können Sie die Google Maps Utils-Bibliothek verwenden, um Ihre Marker zu Clustern zu animieren. Als Erstes müssen Sie ein neues Modellobjekt erstellen, das das implementiert ClusterItem
Schnittstelle. Dieses Modell muss das implementieren getPosition
Methode aus der ClusterItem
Schnittstelle, um ein gültiges zurückzugeben LatLng
Objekt.
öffentliche Klasse ClusterMarkerLocation implementiert ClusterItem private LatLng-Position; public ClusterMarkerLocation (LatLng latLng) position = latLng; @Override public LatLng getPosition () return position; public void setPosition (LatLng-Position) this.position = Position;
Mit dem erstellten Modell können Sie ein neues erstellen Aktivität
namens ClusterMarkerActivity
und fügen Sie es Ihrem Manifest hinzu. Wenn Sie Ihre Karte initialisieren, müssen Sie eine ClusterManager
, verbinden Sie es mit Ihrem Google Karte
, und füge deine hinzu LatLng
Positionen als ClusterMarkerLocations
zum ClusterManager
damit das Dienstprogramm wissen kann, was Cluster bilden sollen. Schauen Sie sich die Implementierung von an initMarkers
um besser zu verstehen, wie das funktioniert.
private void initMarkers () ClusterManagerclusterManager = neuer ClusterManager (dies ist mGoogleMap); mGoogleMap.setOnCameraChangeListener (clusterManager); doppeltes lat; doppelt lng; Zufallsgenerator = new Random (); für (int i = 0; i < 1000; i++ ) lat = generator.nextDouble() / 3; lng = generator.nextDouble() / 3; if( generator.nextBoolean() ) lat = -lat; if( generator.nextBoolean() ) lng = -lng; clusterManager.addItem( new ClusterMarkerLocation( new LatLng( mCenterLocation.latitude + lat, mCenterLocation.longitude + lng ) ) );
In diesem Beispiel erstellen wir 1000 zufällige Punkte zur Anzeige und fügen sie der Karte hinzu. Die Google Maps Utils-Bibliothek kümmert sich um alles andere für uns.
Neben den letzten beiden Elementen enthält die Google Maps Utils-Bibliothek zahlreiche nützliche Hilfsprogramme. Wenn Sie über viele verschiedene Punkte verfügen, die eine Route ausmachen, können Sie sie als Polylinie kodieren und diese Polylinie dann mit Ihrer Karte hinzufügen PolyUtil
. Dadurch wird ein Pfad zwischen jedem Punkt auf der Karte angezeigt.
public class PolylineActivity erweitert BaseMapActivity private static final String polyline = "gsqqFxxu_SyRlTys @ npAkhAzY MsVc'AuHwbB Lil @ [goCqGe | BnUa'A ~ MkbG? eq @ hRq @_ N vKdB"; @Override geschütztes void initMapSettings () ListdecodedPath = PolyUtil.decode (Polylinie); mGoogleMap.addPolyline (neue PolylineOptions (). addAll (decodedPath));
Zusätzlich zu PolyUtil
, Google hat hinzugefügt SphericalUtil
Dies kann zum Messen von Entfernungen oder zum Ermitteln der Geometrie entlang der Oberfläche einer Kugel verwendet werden. Wenn Sie die Entfernung zwischen zwei Punkten auf der Karte ermitteln möchten, können Sie anrufen SphericalUtil.computeDistanceBetween (LatLng-Position1, LatLng-Position2)
zurückkehren a doppelt
der Entfernung in Metern. Wenn Sie die Überschrift zwischen zwei Punkten finden möchten, können Sie anrufen SphericalUtil.computeHeading (LatLng-Punkt1, LatLng-Punkt2)
.
In diesem Zusammenhang eine andere Nutzmethode in der SpericalUtil
In der Klasse können Sie einen Punkt an einer bestimmten Position und Entfernung finden. Ich empfehle das Durchsuchen der Dokumentation, um mehr über die SpericalUtil
Klasse.
In diesem Lernprogramm haben Sie gerade die Oberfläche der Google Maps Utils-Bibliothek und alles, was sie zu bieten hat, zerkratzt. Andere Funktionen, die Sie Ihrer Anwendung hinzufügen können, umfassen das Hinzufügen von Overlays für KML-Daten, das Erstellen benutzerdefinierter Marker und Hilfsmethoden für die Arbeit mit GeoJSON.
Glücklicherweise hat Google die gesamte Bibliothek geöffnet, sodass Sie den Quellcode und den Demo-Code der Bibliothek auf GitHub finden können. Nachdem Sie die letzten drei Teile dieser Serie durchgearbeitet haben, sollten Sie sich jetzt mit Google Maps vertraut machen, um sie zu Ihren eigenen Anwendungen hinzuzufügen, um die Benutzererfahrung zu bereichern und großartige Apps zu erstellen.