Getting gang med Google Maps for Android: Avansert
24
Del
32
Del
Denne Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie kalt Komme i gang med Google Maps for Android.Getting gang med Google Maps for Android. IntermediateGetting gang med Google Maps for Android: Avansert
1. Innledning
Mens de vanlige funksjonene i Google Maps er utrolig nyttig, vil det være ganger at du ønsker å gjøre litt mer. Heldigvis, har Google laget en åpen kildekode-bibliotek som inneholder et sett med verktøy som Android-utviklere kan bruke til å lage sine søknader enda bedre med forbedrede kart.
I denne opplæringen vil du lære hvordan du kan bruke dette verktøyet til biblioteket for å legge varmekartvisualiseringer for dine data, klase stort antall markører for enklere visning, og bruke ulike hjelpemetoder for å arbeide med den sfæriske natur Earth eller tegne ruter på veiene.
Kildefilene for denne opplæringen kan være funnet på GitHub.
2. Oppsett
I den første opplæringen av denne serien, jeg gikk over hvordan du setter opp et prosjekt ved hjelp av Google Developer Console og legge en API-nøkkel til manifest. For denne opplæringen, må du få en API-nøkkel og sette opp prosjektet med et manifest som beskrevet der.
Deretter åpner build.gradle og legge til to nye avhengigheter, en for Play Services for å bruke Google Maps og . en annen for Google Maps utils bibliotek
kompilere 'com.google.android.gms: play-tjenester-kart: 7.8.0'compile' com.google.maps.android:android-maps-utils:0.4 '
Jeg bør merke seg at Google Maps utils bibliotek er teknisk fortsatt i beta, men det har vært tilgjengelig for de siste to årene. Når du har importert disse bibliotekene og synkroniseres prosjektet, må du oppdatere layout filen for MainActivity.java slik at den bruker den egendefinerte fragment vist nedenfor
< RelativeLayout xmlns:. Android = "http://schemas.android .com /apk /res /Android "xmlns: verktøy =" http://schemas.android.com/tools "android: layout_width =" match_parent "android: layout_height =" match_parent "android: paddingLeft =" @ dimen /activity_horizontal_margin " android: paddingRight = "@ dimen /activity_horizontal_margin" android: paddingTop = "@ dimen /activity_vertical_margin" android: paddingBottom = "@ dimen /activity_vertical_margin" verktøy: kontekst = ". MainActivity" > < fragment android: id = "+ id /list_fragment" android: layout_width = "match_parent" android: layout_height = "match_parent" android: name = "com.tutsplus.mapsdemo.fragment.UtilsListFragment" /> < /RelativeLayout >
Deretter oppretter den UtilsListFragment klasse som brukes over slik at den viser en enkel liste over elementer som representerer de ulike delene av biblioteket vil du lære om i denne opplæringen
public class UtilsListFragment strekker ListFragment {Override offentlig. ugyldig onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); ArrayAdapter < String > adapter = new ArrayAdapter < String > (getActivity (), android.R.layout.simple_list_item_1); . String [] varer = getResources () getStringArray (R.array.list_items); adapter.addAll (ny Arraylist (Arrays.asList (eks))); setListAdapter (adapter); }Override Public void onListItemClick (Listview l, Utsikt v, int posisjon, lang id) {super.onListItemClick (l, v, posisjon, id); . String element = ((TextView v)) .getText () toString (); if (getString (R.string.item_clustering) .equalsIgnoreCase (punkt)) {startActivity (new Intent (getActivity (), ClusterMarkerActivity.class)); } Else if (getString (R.string.item_heat_map) .equalsIgnoreCase (punkt)) {startActivity (new Intent (getActivity (), HeatMapActivity.class)); } Else if (getString (R.string.item_polylines) .equalsIgnoreCase (punkt)) {startActivity (new Intent (getActivity (), PolylineActivity.class)); } Else if (getString (R.string.item_spherical_geometry) .equalsIgnoreCase (punkt)) {startActivity (new Intent (getActivity (), SphericalGeometryActivity.class)); }}}
Hver av strengene er definert og plassert i en streng-array for ensartethet
. ≪ string name = "item_clustering" > Clustering < /string > < string name = "item_heat_map" > Heat Kart < /string > < string name = "item_polylines" > Polyline dekoding < /string > < string name = "item_spherical_geometry" > sfærisk geometri utils < /string > < string-array-name = "list_items" > < element > @ streng /item_clustering < /element > < element > @ streng /item_heat_map < /element > < element > @ streng /item_polylines < /element > < element > @ streng /item_spherical_geometry < /element > < /string-matrise >
Når listen er tilgjengelig, må du opprette BaseMapActivity.java, som håndterer alle de vanlige kartet relatert oppsett for hver av eksempelet aktiviteter som du vil bygge. Dette Aktivitet initialiserer en GoogleMap og zoomer kameraet inn til en angitt område. I dette tilfellet er det området i byen Denver i Colorado, USA. . Alt i denne klassen bør se kjent fra de to siste artiklene i denne serien
offentlige abstrakt klasse BaseMapActivity strekker AppCompatActivity {beskyttet LatLng mCenterLocation = new LatLng (39,7392, -104,9903); beskyttet GoogleMap mGoogleMap; Override Beskyttet void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (getMapLayoutId ()); initMapIfNecessary (); }Override Beskyttet void onResume () {super.onResume (); initMapIfNecessary (); } Beskyttet void initMapIfNecessary () {if (mGoogleMap = null) {return; } MGoogleMap = ((MapFragment) getFragmentManager () findFragmentById (R.id.map).) .getMap (); initMapSettings (); initCamera (); } Beskyttet void initCamera () {kameraposisjon stilling = CameraPosition.builder () .target (mCenterLocation) .zoom (getInitialMapZoomLevel ()) att bygga (); mGoogleMap.animateCamera (CameraUpdateFactory.newCameraPosition (posisjon), null); } Beskyttet int getMapLayoutId () {return R.layout.activity_map; } Beskyttet float getInitialMapZoomLevel () {return 12.0f; } Beskyttet abstrakte void initMapSettings ();}
Nå som du har forprosjektet bygget, kan du gå videre til neste avsnitt der du vil opprette en ny aktivitet for hvert verktøy som vi kommer til å dekke i denne opplæringen.
3. Maps varme
Heat Maps er en utmerket måte å visuelt representere konsentrasjoner av datapunkter på et kart. Google Maps utils bibliotek gjør det enkelt å legge dem til et program. For å starte, opprette en ny BaseMapActivity heter HeatMapActivity og legge den til din AndroidManifest.xml fil. På toppen av den klassen, erklærer en HeatmapTileProvider som vi skal bruke til å konstruere kart overlay
privat HeatmapTileProvider mProvider;.
I BaseMapActivity, er en metode som heter initMapSettings kalt som lar deg legge til dine tilpasninger til kartet . For denne aktiviteten, må du overstyre denne metoden for å få en Arraylist av LatLng gjenstander som deretter brukes til å generere HeatmapTileProvider objektet.
Den leverandøren har ulike metoder som kan brukes til å endre utseendet på din varmekartet , slik som graderingsfarger, radius for hvert punkt, og vekten av hvert punkt. Når leverandøren er bygget, kan du opprette varmen kartet TileOverlay og bruke det på kartet ditt
Overrideprotected void initMapSettings () {Arraylist. ≪ LatLng > plasseringer = generateLocations (); mProvider = new HeatmapTileProvider.Builder () data (steder) att bygga (.); mProvider.setRadius (HeatmapTileProvider.DEFAULT_RADIUS); mGoogleMap.addTileOverlay (nye TileOverlayOptions () tileProvider (mProvider).);}
I over gjennomføringen av initMapSettings, er generateLocations en hjelper metode som genererer 1000 LatLng posisjoner rundt den sentrale kartplassering
private Arraylist. < LatLng > generateLocations () {Arraylist < LatLng > steder = new Arraylist < LatLng > (); double lat; double lng; Random generator = new Random (); 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 (ny LatLng (mCenterLocation.latitude + lat, mCenterLocation.longitude + lng)); } Returnere steder;}
Når du er ferdig å implementere initMapSettings og generateLocations, kan du kjøre programmet og klikk på varmen kartutsnittet for å se den i aksjon
4.. Clustering Markers
Når et kart har mange datapunkter i et lite område, kan det bli rotete svært raskt som brukeren zoomer ut. Ikke bare dette, men å ha for mange markører som vises på en gang kan føre til at noen enheter til å avta betraktelig.
For å bidra til å lindre noen av frustrasjon forårsaket av disse spørsmålene, kan du bruke Google Maps utils biblioteket til animere markører i klynger. Det første du trenger å gjøre er å lage en ny modell objekt som implementerer ClusterItem grensesnittet. Denne modellen må implementere getPosition metode fra ClusterItem grensesnitt for å returnere en gyldig LatLng objekt
public class ClusterMarkerLocation implementerer ClusterItem {private LatLng posisjon.; offentlig ClusterMarkerLocation (LatLng latLng) {stilling = latLng; }Override Offentlig LatLng getPosition () {return stilling; } Public void setPosition (LatLng stilling) {this.position = posisjon; }}
Med modellen opprettet, kan du opprette en ny aktivitet kalt ClusterMarkerActivity og legge den til din manifest. Når du initial kartet ditt, må du opprette en ClusterManager, knytte det til GoogleMap, og legge til dine LatLng stillinger som ClusterMarkerLocations til ClusterManager for at verktøyet til å vite hva de skal klyngen. Ta en titt på gjennomføringen av initMarkers å bedre forstå hvordan dette fungerer
private void initMarkers () {ClusterManager. ≪ ClusterMarkerLocation > clusterManager = new ClusterManager < ClusterMarkerLocation > (dette, mGoogleMap); mGoogleMap.setOnCameraChangeListener (clusterManager); double lat; double lng; Random generator = new Random (); 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 (ny ClusterMarkerLocation (ny LatLng (mCenterLocation.latitude + lat, mCenterLocation.longitude + lng))); }}
I dette utvalget, skaper vi 1000 tilfeldige punkter å vise og legge dem til kartet. Google Maps utils bibliotek håndterer alt annet for oss.
5. Andre Utilities
I tillegg til de to siste elementene, er full av små nyttige verktøy i Google Maps utils bibliotek. Hvis du har mange forskjellige punkter som utgjør en rute, kan du kode dem som en polylinje og deretter legge til at polylinje i kartet ditt ved hjelp PolyUtil. Dette vil vise en vei mellom hvert av punktene langs kartet
public class PolylineActivity strekker BaseMapActivity {private static endelige String polyline = "gsqqFxxu_SyRlTys @ npAkhAzY {MsVc`AuHwbB} Lil @} [goCqGe |. BnUa`A ~ MkbG? eq @ HRQ}_ N} vKdB "; Override Beskyttet void initMapSettings () {List < LatLng > decodedPath = PolyUtil.decode (polylinje); mGoogleMap.addPolyline (. nye PolylineOptions () addAll (decodedPath)); }}
I tillegg til PolyUtil, Google har lagt SphericalUtil som kan brukes til å måle avstander eller regne ut geometri langs overflaten av en kule. Hvis du ønsker å finne avstanden mellom to punkter på kartet, kan du ringe SphericalUtil.computeDistanceBetween (LatLng position1, LatLng Position2) for å returnere en dobbel av avstanden i meter. Hvis du ønsker å finne overskriften mellom to punkter, kan du ringe SphericalUtil.computeHeading (LatLng point1, LatLng poeng2).
I forhold til dette, annet verktøy metoden i SpericalUtil klassen kan du finne et punkt på en bestemt kurs og avstand unna. Jeg anbefaler å surfe på dokumentasjonen for å lære mer om SpericalUtil klassen.
Konklusjon
I denne opplæringen, har du bare skrapet overflaten av Google Maps utils biblioteket og alt den har å tilby. Annen funksjonalitet det kan legge til din søknad omfatter legge overlegg for KML data, lage egendefinerte markører, og hjelpemetoder for å arbeide med GeoJSON.
Heldigvis har Google åpent hentet hele biblioteket, slik at du kan finne bibliotekets kilde kode og demo kode på GitHub. Etter å ha gått gjennom de tre siste 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 gjøre gode apps.