Hoewel de standaardfuncties van Google Maps ongelooflijk handig zijn, zijn er momenten dat u iets meer wilt doen. Gelukkig heeft Google een open source-bibliotheek gemaakt met een reeks hulpprogramma's die Android-ontwikkelaars kunnen gebruiken om hun applicaties nog beter te maken met verbeterde kaarten.
In deze zelfstudie leert u hoe u deze hulpprogramma-bibliotheek gebruikt om heat map-visualisaties voor uw gegevens toe te voegen, grote aantallen markeringen te clusteren voor eenvoudiger weergave en verschillende hulpprogramma's te gebruiken voor het werken met de bolvorm van de aarde of het tekenen van routes op wegen.
De bronbestanden voor deze tutorial zijn te vinden op GitHub.
In de eerste zelfstudie van deze serie heb ik besproken hoe u een project kunt instellen met behulp van de Google-ontwikkelaarsconsole en een API-sleutel toevoegt aan uw manifest. Voor deze zelfstudie hebt u een API-sleutel nodig en stelt u uw project in met een manifest zoals hier wordt beschreven.
Open vervolgens build.gradle en voeg twee nieuwe afhankelijkheden toe, een voor Play Services om Google Maps te gebruiken en een andere voor de bibliotheek Google Maps Utils.
compileer 'com.google.android.gms: play-services-maps: 7.8.0' compileer 'com.google.maps.android:android-maps-utils:0.4'
Ik moet er rekening mee houden dat de Google Maps Utils-bibliotheek technisch gezien nog steeds in bèta is, hoewel deze al twee jaar beschikbaar is. Nadat u deze bibliotheken hebt geïmporteerd en het project hebt gesynchroniseerd, moet u het lay-outbestand bijwerken MainActivity.java zodat het het onderstaande aangepaste fragment gebruikt.
Maak vervolgens de UtilsListFragment
klasse die hierboven wordt gebruikt, zodat deze een eenvoudige lijst met items weergeeft die de verschillende delen van de bibliotheek vertegenwoordigen waarover u meer te weten zult komen in deze zelfstudie.
public class UtilsListFragment breidt ListFragment uit @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); ArrayAdapteradapter = nieuwe ArrayAdapter (getActivity (), android.R.layout.simple_list_item_1); String [] items = getResources (). GetStringArray (R.Array.list_items); adapter.addAll (nieuwe ArrayList (Arrays.asList (items))); setListAdapter (adapter); @Override public void onListItemClick (ListView l, View v, int position, long id) super.onListItemClick (l, v, position, id); Stringitem = ((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));
Elk van de tekenreeksen wordt gedefinieerd en in een geplaatst koord array
voor uniformiteit.
clustering Heat Map Polyline decodering Bolvormige meetkundet Utils - @ String / item_clustering
- @ String / item_heat_map
- @ String / item_polylines
- @ String / item_spherical_geometry
Zodra uw lijst beschikbaar is, moet u maken BaseMapActivity.java, die alle algemene kaartgerelateerde instellingen afhandelt voor elk van de voorbeeldactiviteiten die u gaat bouwen. Deze Activiteit
initialiseert a GoogleMap
en zoomt de camera in op een bepaald gebied. In dit geval is dat gebied de stad Denver in Colorado, VS. Alles in deze klasse moet bekend voorkomen uit de laatste twee artikelen in deze serie.
openbare abstracte klasse BaseMapActivity breidt AppCompatActivity protected LatLng mCenterLocation = new LatLng (39.7392, -104.9903); beschermde GoogleMap mGoogleMap; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (getMapLayoutId ()); initMapIfNecessary (); @Override beschermde leegte onResume () super.onResume (); initMapIfNecessary (); protected void initMapIfNecessary () if (mGoogleMap! = null) ga terug; 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 (positie), null); protected int getMapLayoutId () return R.layout.activity_map; protected float getInitialMapZoomLevel () return 12.0f; beschermd abstract void initMapSettings ();
Nu het eerste project is gebouwd, kunt u doorgaan naar het volgende gedeelte waar u een nieuw project gaat maken Activiteit
voor elk hulpprogramma dat we in deze zelfstudie gaan behandelen.
Warmtekaarten zijn een uitstekende manier om concentraties van gegevenspunten op een kaart visueel weer te geven. De bibliotheek Google Maps Utils maakt het eenvoudig om ze aan een applicatie toe te voegen. Maak om te beginnen een nieuwe BaseMapActivity
genaamd HeatMapActivity
en voeg het toe aan jouw AndroidManifest.xml het dossier. Op de top van die klasse, verklaar a HeatmapTileProvider
die we zullen gebruiken om de kaart-overlay te construeren.
privé HeatmapTileProvider mProvider;
In BaseMapActivity
, een methode genaamd initMapSettings
wordt genoemd waarmee u uw aanpassingen aan de kaart kunt toevoegen. Voor deze Activiteit
, je moet die methode overschrijven om een te krijgen ArrayList
van lengte- en breedtegraad
objecten die vervolgens worden gebruikt om de HeatmapTileProvider
voorwerp.
De aanbieder heeft verschillende methoden die kunnen worden gebruikt om het uiterlijk van uw warmtekaart te wijzigen, zoals de verloopkleuren, de straal voor elk punt en het gewicht van elk punt. Zodra uw provider is gebouwd, kunt u de warmtekaart maken TileOverlay
en pas het toe op je kaart.
@Override protected void initMapSettings () ArrayListlocaties = generateLocations (); mProvider = nieuwe HeatmapTileProvider.Builder (). data (locaties) .build (); mProvider.setRadius (HeatmapTileProvider.DEFAULT_RADIUS); mGoogleMap.addTileOverlay (nieuwe TileOverlayOptions (). tileProvider (mProvider));
In de bovenstaande implementatie van initMapSettings
, generateLocations
is een hulpmethode die 1000 genereert lengte- en breedtegraad
posities rond de centrale kaartlocatie.
privé ArrayListgenerateLocations () ArrayList locaties = nieuwe ArrayList (); dubbele lat; dubbele lng; Willekeurige generator = nieuw Willekeurig (); voor (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;
Als je klaar bent met implementeren initMapSettings
en generateLocations
, je kunt je app gebruiken en op de heat map-sectie klikken om deze in actie te zien.
Wanneer een kaart veel gegevenspunten in een klein gebied heeft, kan deze erg snel rommelig worden wanneer de gebruiker uitzoomt. Niet alleen dit, maar als er te veel markeringen tegelijkertijd worden weergegeven, kunnen sommige apparaten aanzienlijk vertragen.
Om te helpen bij het verlichten van een deel van de frustratie die door deze problemen wordt veroorzaakt, kunt u de Google Maps Utils-bibliotheek gebruiken om uw markeringen in clusters te animeren. Het eerste dat u hoeft te doen, is een nieuw modelobject maken dat de. Implementeert ClusterItem
interface. Dit model moet het getPosition
methode van de ClusterItem
interface om een geldige terug te sturen lengte- en breedtegraad
voorwerp.
public class ClusterMarkerLocation implementeert ClusterItem private LatLng-positie; public ClusterMarkerLocation (LatLng latLng) position = latLng; @Override public LatLng getPosition () returnpositie; public void setPosition (LatLng position) this.position = position;
Met het gemaakte model kunt u een nieuw maken Activiteit
riep ClusterMarkerActivity
en voeg het toe aan je manifest. Wanneer u uw kaart initialiseert, moet u een Clustermanager
, associeer het met jouw GoogleMap
, en voeg uw toe lengte- en breedtegraad
posities als ClusterMarkerLocations
naar de Clustermanager
voor het hulpprogramma om te weten wat te clusteren. Bekijk de implementatie van initMarkers
om beter te begrijpen hoe dit werkt.
private void initMarkers () ClusterManagerclusterManager = nieuwe ClusterManager (dit, mGoogleMap); mGoogleMap.setOnCameraChangeListener (Clustermanager); dubbele lat; dubbele lng; Willekeurige generator = nieuw Willekeurig (); voor (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 dit voorbeeld maken we 1000 willekeurige punten om ze weer te geven en toe te voegen aan de kaart. De Google Maps Utils-bibliotheek behandelt al het andere voor ons.
Naast de laatste twee items staat de bibliotheek Google Maps Utils vol met kleine handige hulpprogramma's. Als u veel verschillende punten hebt die samen een route vormen, kunt u deze coderen als een polylijn en vervolgens die polylijn toevoegen aan uw kaart met behulp van PolyUtil
. Dit toont een pad tussen elk van de punten op de kaart.
public class PolylineActivity breidt BaseMapActivity uit private static final String polyline = "gsqqFxxu_SyRlTys @ npAkhAzY MsVc'AuHwbB Lil @ [goCqGe | BnUa'A ~ MkbG? eq @ hRq @_ N vKdB"; @Override protected void initMapSettings () ListdecodedPath = PolyUtil.decode (polylijn); mGoogleMap.addPolyline (nieuwe PolylineOptions (). addAll (decodedPath));
In aanvulling op PolyUtil
, Google heeft toegevoegd SphericalUtil
die kan worden gebruikt om afstanden te meten of geometrie langs het oppervlak van een bol te bepalen. Als u de afstand tussen twee punten op de kaart wilt vinden, kunt u bellen SphericalUtil.computeDistanceTween Between (LatLng positie1, LatLng positie2)
terugsturen dubbele
van de afstand in meters. Als u de kop tussen twee punten wilt vinden, kunt u bellen SphericalUtil.computeHeading (LatLng point1, LatLng point2)
.
Met betrekking tot dit, een andere utility-methode in de SpericalUtil
klasse stelt u in staat een punt op een bepaalde koers en op een zekere afstand te vinden. Ik raad aan om door de documentatie te bladeren voor meer informatie over de SpericalUtil
klasse.
In deze zelfstudie heeft u net de oppervlakte van de Google Maps Utils-bibliotheek en alles wat deze te bieden heeft ingekrast. Andere functionaliteit die het aan uw toepassing kan toevoegen, is onder meer het toevoegen van overlays voor KML-gegevens, het maken van aangepaste markeringen en hulpmethoden voor het werken met GeoJSON.
Gelukkig heeft Google de hele bibliotheek geopend, zodat je de broncode en democode van de bibliotheek op GitHub kunt vinden. Nadat u de laatste drie delen van deze serie hebt doorlopen, moet u nu vertrouwd zijn met Google Maps om ze toe te voegen aan uw eigen toepassingen om de gebruikerservaring te verrijken en geweldige apps te maken.