Komme i gang med Google Maps for Android Avansert

1. Introduksjon

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.

2. Oppsett

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

3. Varmekart

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

I ovennevnte implementering av initMapSettingsgenerateLocations er en hjelpemetode som genererer 1000 LatLng posisjoner rundt den sentrale kartposisjonen.

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

4. Clustering Markers

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

5. Andre verktøy

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 () Liste dekodetPath = 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.

Konklusjon

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.