Selv om standardfunksjonene i Google Maps er utrolig nyttige, vil det være ganger du vil gjøre litt mer. Heldigvis har Google opprettet et åpen kildebibliotek som inneholder et sett med verktøy som Android-utviklere kan bruke til å gjøre programmene enda bedre med forbedrede kart.
I denne opplæringen lærer du hvordan du bruker dette verktøybiblioteket for å legge til varmekartvisualiseringer for dataene dine, klynge et stort antall markører for enklere visning og bruke ulike bruksmetoder for å arbeide med jordens sfæriske natur eller tegningsruter på veier.
Kildefilene for denne opplæringen finner du på GitHub.
I den første opplæringen i denne serien gikk jeg over hvordan du setter opp et prosjekt ved hjelp av Google Developer Console og legger til en API-nøkkel til manifestet ditt. For denne opplæringen må du få en API-nøkkel og sette opp prosjektet ditt med et manifest som beskrevet der.
Deretter åpne build.gradle og legg til to nye avhengigheter, en for Play Services å bruke Google Maps og en annen til Google Maps Utils-biblioteket.
kompilere 'com.google.android.gms: play-services-maps: 7.8.0' compile 'com.google.maps.android:android-maps-utils:0.4'
Jeg bør merke at Google Maps Utils-biblioteket er teknisk fortsatt i beta, selv om det har vært tilgjengelig de siste to årene. Når du har importert disse bibliotekene og synkronisert prosjektet, må du oppdatere layoutfilen for MainActivity.java slik at den bruker det egendefinerte fragmentet som vises nedenfor.
Deretter lager du UtilsListFragment
klassen som brukes ovenfor, slik at den viser en enkel liste over elementer som representerer de ulike delene av biblioteket du vil lære om i denne opplæringen.
offentlig klasse UtilsListFragment utvider ListFragment @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); ArrayAdapteradapter = ny ArrayAdapter (getActivity (), android.R.layout.simple_list_item_1); String [] items = getResources (). GetStringArray (R.array.list_items); adapter.addAll (ny ArrayList (Arrays.asList (elementer))); setListAdapter (adapter); @Override public void onListItemClick (Listevisning l, Vis v, int posisjon, lang id) super.onListItemClick (l, v, posisjon, id); String item = ((TextView) v) .getText (). ToString (); hvis (getString (R.string.item_clustering) .equalsIgnoreCase (item)) startActivity (new Intent (getActivity (), ClusterMarkerActivity.class)); annet hvis (getString (R.string.item_heat_map) .equalsIgnoreCase (item)) startActivity (new Intent (getActivity (), HeatMapActivity.class)); annet hvis (getString (R.string.item_polylines) .equalsIgnoreCase (item)) startActivity (new Intent (getActivity (), PolylineActivity.class)); annet hvis (getString (R.string.item_spherical_geometry) .equalsIgnoreCase (item)) startActivity (new Intent (getActivity (), SphericalGeometryActivity.class));
Hver av strengene er definert og plassert i a string-matrise
for enhetlighet.
Gruppering Varmekart Polylinekoding Kuleformet geometri Utils - @ Snor / item_clustering
- @ Snor / item_heat_map
- @ string / item_polylines
- @ Snor / item_spherical_geometry
Når listen din er tilgjengelig, må du opprette BaseMapActivity.java, som håndterer alle de vanlige kartrelaterte oppsettene for hvert av de eksempeldriftene du vil bygge. Dette Aktivitet
initialiserer a Google Kart
og zoomer kameraet inn i et spesifisert område. I dette tilfellet er området Denver i Colorado, USA. Alt i denne klassen skal se kjent fra de to siste artiklene i denne serien.
offentlig abstrakt klasse BaseMapActivity utvider AppCompatActivity protected LatLng mCenterLocation = new LatLng (39.7392, -104.9903); beskyttet GoogleMap mGoogleMap; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (getMapLayoutId ()); initMapIfNecessary (); @Override protected void onResume () super.onResume (); initMapIfNecessary (); beskyttet tomt initMapIfNecessary () if (mGoogleMap! = null) return; mGoogleMap = ((MapFragment) getFragmentManager (). findFragmentById (R.id.map)) .getMap (); initMapSettings (); initCamera (); beskyttet tomt initCamera () CameraPosition position = CameraPosition.builder () .target (mCenterLocation) .zoom (getInitialMapZoomLevel ()) .build (); mGoogleMap.animateCamera (CameraUpdateFactory.newCameraPosition (posisjon), null); beskyttet int getMapLayoutId () return R.layout.activity_map; beskyttet float getInitialMapZoomLevel () return 12.0f; beskyttet abstrakt tomt initMapSettings ();
Nå som du har det opprinnelige prosjektet bygget, kan du fortsette videre til neste del der du vil opprette en ny Aktivitet
for hvert verktøy som vi skal dekke i denne opplæringen.
Varmekart er en utmerket måte å visuelt representere konsentrasjoner av datapunkter på et kart. Google Maps Utils-biblioteket gjør det enkelt å legge til dem i et program. For å starte, opprett en ny BaseMapActivity
oppkalt HeatMapActivity
og legg det til din AndroidManifest.xml fil. På toppen av den klassen, erklære en HeatmapTileProvider
som vi skal bruke til å konstruere kartoverlegget.
privat HeatmapTileProvider mProvider;
I BaseMapActivity
, en metode som heter initMapSettings
kalles som lar deg legge til tilpassinger på kartet. For dette Aktivitet
, du må overstyre den metoden for å få en Arraylist
av LatLng
objekter som deretter brukes til å generere HeatmapTileProvider
gjenstand.
Leverandøren har ulike metoder som kan brukes til å endre utseendet på varmekartet, for eksempel gradientfarger, radius for hvert punkt og vekten av hvert punkt. Når leverandøren er bygget, kan du opprette varmekartet TileOverlay
og bruk den på kartet ditt.
@Override protected void initMapSettings () ArrayListsteder = generateLocations (); mProvider = ny HeatmapTileProvider.Builder (). data (steder) .build (); mProvider.setRadius (HeatmapTileProvider.DEFAULT_RADIUS); mGoogleMap.addTileOverlay (ny TileOverlayOptions (). tileProvider (mProvider));
I ovennevnte implementering av initMapSettings
, generateLocations
er en hjelpemetode som genererer 1000 LatLng
posisjoner rundt den sentrale kartposisjonen.
privat ArrayListgenerateLocations () ArrayList steder = ny ArrayList (); dobbel lat; dobbel lng; Tilfeldig generator = ny Tilfeldig (); for (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;
Når du er ferdig med å implementere initMapSettings
og generateLocations
, Du kan kjøre appen din og klikke på delen varmekart for å se den i aksjon.
Når et kart har mange datapunkter i et lite område, kan det bli rotete veldig raskt når brukeren zoomer ut. Ikke bare dette, men å ha for mange markører som vises samtidig kan føre til at noen enheter senkes betydelig.
For å bidra til å lindre noen av frustrasjonen som skyldes disse problemene, kan du bruke Google Maps Utils-biblioteket til å animere markørene dine i klynger. Det første du må gjøre er å lage et nytt modellobjekt som implementerer ClusterItem
grensesnitt. Denne modellen må implementere getPosition
metode fra ClusterItem
grensesnitt for å returnere en gyldig LatLng
gjenstand.
offentlig klasse ClusterMarkerLocation implementerer ClusterItem private LatLng posisjon; offentlig ClusterMarkerLocation (LatLng latLng) posisjon = latLng; @Override public LatLng getPosition () returposisjon; Offentlig tomt settPosisjon (LatLng posisjon) this.position = posisjon;
Med modellen opprettet, kan du opprette en ny Aktivitet
kalt ClusterMarkerActivity
og legg det til manifestet ditt. Når du initialiserer kartet, må du opprette en ClusterManager
, knytte den sammen med din Google Kart
, og legg til din LatLng
stillinger som ClusterMarkerLocations
til ClusterManager
for verktøyet å vite hva som skal klynge. Ta en titt på implementeringen av initMarkers
for bedre å forstå hvordan dette virker.
private void initMarkers () ClusterManagerclusterManager = ny ClusterManager (dette, mGoogleMap); mGoogleMap.setOnCameraChangeListener (clusterManager); dobbel lat; dobbel lng; Tilfeldig generator = ny Tilfeldig (); for (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 ) ) );
I denne prøven oppretter vi 1000 tilfeldige poeng for å vise og legge til dem på kartet. Google Maps Utils-biblioteket håndterer alt annet for oss.
I tillegg til de to siste elementene er Google Maps Utils-biblioteket fullt av små nyttige verktøy. Hvis du har mange forskjellige punkter som utgjør en rute, kan du kode dem som en polyline og deretter legge til den polylinen på kartet ditt ved å bruke PolyUtil
. Dette viser en bane mellom hvert av punktene langs kartet.
offentlig klasse PolylineActivity utvider BaseMapActivity privat statisk endelig strengpolyline = "gsqqFxxu_SyRlTys @ npAkhAzY MsVc'AuHwbB Lil @ [goCqGe | BnUa' ~ MkbG? eq @ hRq @_N vKdB"; @Override protected void initMapSettings () ListedekodetPath = PolyUtil.decode (polyline); mGoogleMap.addPolyline (nye PolylineOptions (). addAll (decodedPath));
I tillegg til PolyUtil
, Google har lagt til SphericalUtil
som kan brukes til å måle avstander eller finne ut geometri langs overflaten av en sfære. Hvis du vil finne avstanden mellom to punkter på kartet, kan du ringe SphericalUtil.computeDistanceBetween (LatLng posisjon1, LatLng posisjon2)
å returnere a dobbelt
av avstanden i meter. Hvis du vil finne overskriften mellom to punkter, kan du ringe SphericalUtil.computeHeading (LatLng punkt1, LatLng punkt2)
.
I forhold til dette, en annen bruksmetode i SpericalUtil
klassen lar deg finne et punkt i en bestemt posisjon og avstand unna. Jeg anbefaler å bla gjennom dokumentasjonen for å lære mer om SpericalUtil
klasse.
I denne opplæringen har du nettopp riper overflaten på Google Maps Utils-biblioteket og alt det har å tilby. Andre funksjoner som kan legges til i programmet, inkluderer å legge til overlegg for KML-data, opprette egendefinerte markører og hjelpemetoder for å jobbe med GeoJSON.
Heldigvis har Google åpnet hele biblioteket, slik at du kan finne bibliotekets kildekode og demokode på GitHub. Etter å ha gått gjennom de siste tre delene av denne serien, bør du nå være komfortabel nok med Google Maps for å legge dem til dine egne applikasjoner for å berike brukeropplevelsen og lage gode apper.