Erste Schritte mit Google Maps für Android Erweitert

1. Einleitung

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.

2. Setup

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); ArrayAdapter adapter = 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.

3. Heat Maps

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 () ArrayList locations = generateLocations (); mProvider = new HeatmapTileProvider.Builder (). data (locations) .build (); mProvider.setRadius (HeatmapTileProvider.DEFAULT_RADIUS); mGoogleMap.addTileOverlay (neue TileOverlayOptions (). tileProvider (mProvider)); 

In der obigen Implementierung von initMapSettingsErzeugungspositionen ist eine Hilfsmethode, die 1000 generiert LatLng Positionen rund um die zentrale Kartenposition.

private ArrayList generateLocations () 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.

4. Clustering-Marker

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 () ClusterManager clusterManager = 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.

5. Andere Dienstprogramme

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 () List decodedPath = 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.

Fazit

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.