În timp ce caracteristicile standard ale Google Maps sunt incredibil de utile, vor exista momente pe care doriți să le faceți ceva mai mult. Din fericire, Google a creat o bibliotecă open source care conține un set de utilitare pe care dezvoltatorii Android le pot utiliza pentru a face aplicațiile lor chiar mai bune cu ajutorul hărților îmbunătățite.
În acest tutorial veți învăța cum să utilizați această bibliotecă de utilități pentru a adăuga vizualizări pentru hărțile de căldură pentru datele dvs., clusterați un număr mare de marcatori pentru o vizionare mai ușoară și utilizați diverse metode de utilitate pentru a lucra cu natura sferică a Pământului sau trasee de traseu pe drumuri.
Fișierele sursă pentru acest tutorial pot fi găsite pe GitHub.
În primul tutorial al acestei serii, am analizat cum să configurați un proiect folosind Consola pentru dezvoltatori Google și să adăugați o cheie API în manifest. Pentru acest tutorial, trebuie să obțineți o cheie API și să configurați proiectul cu un manifest așa cum este descris aici.
În continuare, deschideți-vă build.gradle și adăugați două noi dependențe, una pentru serviciile Play pentru a utiliza Google Maps și una pentru biblioteca utilitare Google Maps.
compile 'com.google.android.gms: play-services-maps: 7.8.0' compilează com.google.maps.android:android-maps-utils:0.4 '
Trebuie să remarcăm că biblioteca Utils Google Maps este încă în stadiu tehnic, deși a fost disponibilă în ultimii doi ani. Odată ce ați importat aceste biblioteci și ați sincronizat proiectul, trebuie să actualizați fișierul de aspect pentru MainActivity.java astfel încât acesta să utilizeze fragmentul personalizat prezentat mai jos.
Apoi, creați UtilsListFragment
clasa care este utilizată mai sus, astfel încât să afișeze o listă simplă de elemente care reprezintă diferitele părți ale bibliotecii pe care le veți afla în acest tutorial.
clasa publică UtilsListFragment extinde ListFragment @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); ArrayAdapteradaptor = nou ArrayAdapter (getActivity (), android.R.layout.simple_list_item_1); String [] elemente = getResources (). GetStringArray (R.array.list_items); adapter.addAll (noul ArrayList (Arrays.asList (items))); setListAdapter (adaptor); @Override publice void onListItemClick (ListView l, Vizualizare v, pozitie int, id lung) super.onListItemClick (l, v, pozitie, id); Elementul String = ((TextView) v) .getText (). ToString (); dacă (getString (R.string.item_clustering) .equalsIgnoreCase (element)) startActivity (nou intenție (getActivity (), ClusterMarkerActivity.class)); else dacă (getString (R.string.item_heat_map) .equalsIgnoreCase (element)) startActivity (nou intent (getActivity (), HeatMapActivity.class)); altfel dacă (getString (R.string.item_polylines) .equalsIgnoreCase (element)) startActivity (intentul nou (getActivity (), PolylineActivity.class)); altceva (getString (R.string.item_spherical_geometry) .equalsIgnoreCase (element)) startActivity (nou intent (getActivity (), SphericalGeometryActivity.class));
Fiecare șiruri de caractere sunt definite și plasate în a string-array
pentru uniformitate.
clustering Harta termografica Decodificarea polilinilor Sisteme de geometrie sferică - @ String / item_clustering
- @ String / item_heat_map
- @ string / item_polylines
- @ String / item_spherical_geometry
După ce lista este disponibilă, trebuie să creați BaseMapActivity.java, care se ocupă de toate setările legate de harta comună pentru fiecare dintre exemplele de activități pe care le veți construi. Acest Activitate
inițializează a Harta Google
și apropie camera într-o anumită zonă. În acest caz, acea zonă este orașul Denver din Colorado, Statele Unite ale Americii. Totul din această clasă ar trebui să pară familiar din ultimele două articole din această serie.
public abstract class BaseMapActivity extinde AppCompatActivity protejat LatLng mCenterLocation = new LatLng (39.7392, -104.9903); mGoogleMap protejat GoogleMap; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (getMapLayoutId ()); initMapIfNecessary (); @Override protejate void onResume () super.onResume (); initMapIfNecessary (); void protejat initMapIfNecessary () if (mGoogleMap! = null) return; mGoogleMap = ((MapFragment) getFragmentManager (). findFragmentById (R.id.map)) .getMap (); initMapSettings (); initCamera (); protejat void initCamera () CameraPosition pozitie = CameraPosition.builder () .target (mCenterLocation) .zoom (getInitialMapZoomLevel ()) .build (); mGoogleMap.animateCamera (CameraUpdateFactory.newCameraPosition (poziție), null); protejat int getMapLayoutId () return R.layout.activity_map; float protejat getInitialMapZoomLevel () return 12.0f; protejat abstract void initMapSettings ();
Acum, că ați construit proiectul inițial, puteți continua la următoarea secțiune unde veți crea un nou Activitate
pentru fiecare utilitate pe care o vom acoperi în acest tutorial.
Hărțile de căldură reprezintă o modalitate excelentă de a vizualiza vizual concentrațiile punctelor de date pe o hartă. Biblioteca Utils Google Maps ușurează adăugarea acestora la o aplicație. Pentru a începe, creați un nou BaseMapActivity
numit HeatMapActivity
și adăugați-o la dvs. AndroidManifest.xml fişier. În partea de sus a clasei respective, declarați a HeatmapTileProvider
pe care o vom folosi pentru a construi suprapunerea hărții.
privat HeatmapTileProvider mProvider;
În BaseMapActivity
, o metodă numită initMapSettings
este numit care vă permite să adăugați personalizările pe hartă. Pentru asta Activitate
, trebuie să treceți peste această metodă pentru a obține o ArrayList
de LatLng
obiecte care sunt apoi folosite pentru a genera HeatmapTileProvider
obiect.
Furnizorul are diferite metode care pot fi utilizate pentru a schimba aspectul hărții dvs. de căldură, cum ar fi culorile gradientului, raza fiecărui punct și greutatea fiecărui punct. Odată ce furnizorul dvs. este construit, puteți crea harta de căldură TileOverlay
și aplicați-o pe hartă.
@Override protejate void initMapSettings () ArrayListlocații = generateLocations (); mProvider = noul HeatmapTileProvider.Builder () date (locations) .build (); mProvider.setRadius (HeatmapTileProvider.DEFAULT_RADIUS); mGoogleMap.addTileOverlay (noul TileOverlayOptions (). tileProvider (mProvider));
În implementarea de mai sus a initMapSettings
, generateLocations
este o metodă de ajutor care generează 1000 LatLng
poziții în jurul locației centrale a hărții.
privat ArrayListgenerateLocations () ArrayList locații = noul ArrayList (); dublă lat; dublu lng; Generator aleatoriu = nou Random (); pentru (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;
Odată ce ați terminat implementarea initMapSettings
și generateLocations
, puteți rula aplicația dvs. și faceți clic pe secțiunea hărții termice pentru ao vedea în acțiune.
Atunci când o hartă are o mulțime de puncte de date într-o zonă mică, aceasta poate fi aglomerată foarte rapid, pe măsură ce utilizatorul se mări. Nu numai acest lucru, dar având prea multe indicatoare afișate simultan, poate provoca încetinirea considerabilă a unor dispozitive.
Pentru a ajuta la atenuarea frustrărilor cauzate de aceste probleme, puteți utiliza biblioteca utilitare Google Maps pentru a anima marcatorii în clustere. Primul lucru pe care trebuie să-l faceți este să creați un nou obiect model care să implementeze ClusterItem
interfață. Acest model trebuie implementat getPosition
metoda de la ClusterItem
pentru a returna o valoare validă LatLng
obiect.
clasa publică ClusterMarkerLocation implementează ClusterItem privată Poziție LatLng; public ClusterMarkerLocation (latlang latLng) poziție = latLng; @Override public LatLng getPosition () retur; public void setPosition (poziția LatLng) this.position = position;
Cu modelul creat, puteți crea un nou model Activitate
denumit ClusterMarkerActivity
și adăugați-o la manifestarea voastră. Când inițializați harta, trebuie să creați o ClusterManager
, asociați-o cu dvs. Harta Google
, și adăugați-vă LatLng
poziții ca ClusterMarkerLocations
la ClusterManager
pentru utilitate să știe ce să cluster. Aruncați o privire la punerea în aplicare a initMarkers
pentru a înțelege mai bine cum funcționează acest lucru.
private void initMarkers () ClusterManagerclusterManager = ClusterManager nou (aceasta, mGoogleMap); mGoogleMap.setOnCameraChangeListener (clusterManager); dublă lat; dublu lng; Generator aleatoriu = nou Random (); pentru (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 ) ) );
În acest exemplu, creăm 1000 de puncte aleatoare pentru a le afișa și a le adăuga pe hartă. Biblioteca Google Maps Utilities se ocupă de orice altceva pentru noi.
În plus față de ultimele două elemente, biblioteca Utile Google Maps este plină de utilități utile mici. Dacă aveți multe puncte diferite care alcătuiesc un traseu, le puteți codifica ca o polilinie și apoi adăugați acea polilinie pe hartă utilizând PolyUtil
. Aceasta va afișa o cale între fiecare dintre punctele de pe hartă.
clasa publica PolylineActivity extinde BaseMapActivity private static final String polyline = "gsqqFxxu_SyRlTys @ npAkhAzY MsVc'AuHwbB Lil @ [goCqGe | BnUa'A ~ MkbG? eq @ hRq @_ N vKdB"; @Override protejate void initMapSettings () ListdecodedPath = PolyUtil.decode (polilină); mGoogleMap.addPolyline (noi PolylineOptions ()) addAll (decodedPath));
Pe lângă PolyUtil
, Google a adăugat SphericalUtil
care pot fi folosite pentru a măsura distanțele sau a-și imagina geometria de-a lungul suprafeței unei sfere. Dacă doriți să găsiți distanța dintre două puncte de pe hartă, puteți apela SphericalUtil.computereDistanță între (poziția LatLng1, poziția LatLng2)
pentru a returna a dubla
din distanța în metri. Dacă doriți să găsiți rubrica între două puncte, puteți apela SphericalUtil.computeHeading (punctul lat1, punctul 2)
.
În legătură cu aceasta, o altă metodă de utilitate în SpericalUtil
vă permite să găsiți un punct la o anumită poziție și la distanță. Vă recomandăm să răsfoiți documentația pentru a afla mai multe despre SpericalUtil
clasă.
În acest tutorial, tocmai ați zgâriat suprafața bibliotecii utilitare Google Maps și tot ce are de oferit. Alte funcționalități pe care le poate adăuga aplicației dvs. includ adăugarea de suprapuneri pentru date KML, crearea de marcaje personalizate și metode de ajutor pentru lucrul cu GeoJSON.
Din fericire, Google a deschis o sursă a întregii biblioteci, astfel încât să puteți găsi codul sursă și codul demo al bibliotecii pe GitHub. După ce ați trecut prin ultimele trei părți ale acestei serii, acum ar trebui să fiți suficient de confortabil cu Google Maps pentru a le adăuga la propriile aplicații, pentru a îmbogăți experiența utilizatorului și a face aplicații grozave.