Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
Android Maps Utils | 3,455 | 10 | 5 days ago | 41 | July 30, 2022 | 40 | apache-2.0 | Java | ||
Maps SDK for Android Utility Library | ||||||||||
Android Samples | 2,337 | 12 days ago | 7 | apache-2.0 | Java | |||||
Samples demonstrating how to use Maps SDK for Android | ||||||||||
Cordova Plugin Googlemaps | 1,657 | 459 | 10 | 10 months ago | 63 | April 09, 2020 | 48 | apache-2.0 | JavaScript | |
Google Maps plugin for Cordova | ||||||||||
Google Maps Ios Utils | 664 | 186 | 2 months ago | 31 | January 05, 2022 | 40 | apache-2.0 | Objective-C | ||
Google Maps SDK for iOS Utility Library | ||||||||||
Googledirectionlibrary | 539 | 2 years ago | 1 | April 13, 2021 | 3 | apache-2.0 | Java | |||
[Android] Library for Google Direction API for Google Maps Android API v2 | ||||||||||
Android Maps Ktx | 276 | 2 | 19 days ago | 30 | March 30, 2022 | 8 | apache-2.0 | Kotlin | ||
Kotlin extensions (KTX) for the Maps SDK and Utility Library for Android | ||||||||||
Pxgoogledirections | 261 | 5 | 4 years ago | 8 | October 22, 2018 | 5 | bsd-3-clause | Swift | ||
Google Directions API helper for iOS, written in Swift | ||||||||||
Maps Sdk For Ios Samples | 249 | 3 months ago | 5 | apache-2.0 | Objective-C | |||||
Samples for the Google Maps and Places SDKs for iOS | ||||||||||
Mtdirectionskit | 205 | 9 years ago | 1 | March 24, 2015 | 21 | other | Objective-C | |||
Show directions directly on top of MKMapView | ||||||||||
Android Places Demos | 159 | 24 days ago | 16 | apache-2.0 | Java | |||||
Google Places SDK Demos for Android |
This open-source library contains utilities that are useful for a wide range of applications using the Google Maps SDK for Android.
You can also find Kotlin extensions for this library here.
The generated reference docs for a full list of classes and their methods.
Written guides for using the utilities are published in Google Maps Platform documentation.
dependencies {
// Utilities for Maps SDK for Android (requires Google Play Services)
implementation 'com.google.maps.android:android-maps-utils:3.4.0'
}
This repository includes a demo app that illustrates the use of this library.
To run the demo app, you'll have to:
local.properties
in the root project (this file should NOT be under version control to protect your API key)local.properties
that looks like MAPS_API_KEY=YOUR_API_KEY
, where YOUR_API_KEY
is the API key you obtained in the first stepdebug
variant for the Maps SDK for Android versionImprovements made in version 1.0.0 of the library to support multiple layers on the map caused breaking changes to versions prior to it. These changes also modify behaviors that are documented in the Maps SDK for Android Maps documentation site. This section outlines all those changes and how you can migrate to use this library since version 1.0.0.
Click events originate in the layer-specific object that added the marker/ground overlay/polyline/polygon. In each layer, the click handlers are passed to the marker, ground overlay, polyline, or polygon Collection
object.
// Clustering
ClusterManager<ClusterItem> clusterManager = // Initialize ClusterManager - if you're using multiple maps features, use the constructor that passes in Manager objects (see next section)
clusterManager.setOnClusterItemClickListener(item -> {
// Listen for clicks on a cluster item here
return false;
});
clusterManager.setOnClusterClickListener(item -> {
// Listen for clicks on a cluster here
return false;
});
// GeoJson
GeoJsonLayer geoJsonLayer = // Initialize GeoJsonLayer - if you're using multiple maps features, use the constructor that passes in Manager objects (see next section)
geoJsonLayer.setOnFeatureClickListener(feature -> {
// Listen for clicks on GeoJson features here
});
// KML
KmlLayer kmlLayer = // Initialize KmlLayer - if you're using multiple maps features, use the constructor that passes in Manager objects (see next section)
kmlLayer.setOnFeatureClickListener(feature -> {
// Listen for clicks on KML features here
});
If you use one of Manager objects in the package com.google.maps.android
(e.g. GroundOverlayManager
, MarkerManager
, etc.), say from adding a KML layer, GeoJson layer, or Clustering, you will have to rely on the Collection specific to add an object to the map rather than adding that object directly to GoogleMap
. This is because each Manager sets itself as a click listener so that it can manage click events coming from multiple layers.
For example, if you have additional GroundOverlay
objects:
New
GroundOverlayManager groundOverlayManager = // Initialize
// Create a new collection first
GroundOverlayManager.Collection groundOverlayCollection = groundOverlayManager.newCollection();
// Add a new ground overlay
GroundOverlayOptions options = // ...
groundOverlayCollection.addGroundOverlay(options);
Old
GroundOverlayOptions options = // ...
googleMap.addGroundOverlay(options);
This same pattern applies for Marker
, Circle
, Polyline
, and Polygon
.
If you use MarkerManager
, adding an InfoWindowAdapter
and/or an OnInfoWindowClickListener
should be done on the MarkerManager.Collection
object.
New
CustomInfoWindowAdapter adapter = // ...
OnInfoWindowClickListener listener = // ...
// Create a new Collection from a MarkerManager
MarkerManager markerManager = // ...
MarkerManager.Collection collection = markerManager.newCollection();
// Set InfoWindowAdapter and OnInfoWindowClickListener
collection.setInfoWindowAdapter(adapter);
collection.setOnInfoWindowClickListener(listener);
// Alternatively, if you are using clustering
ClusterManager<ClusterItem> clusterManager = // ...
MarkerManager.Collection markerCollection = clusterManager.getMarkerCollection();
markerCollection.setInfoWindowAdapter(adapter);
markerCollection.setOnInfoWindowClickListener(listener);
Old
CustomInfoWindowAdapter adapter = // ...
OnInfoWindowClickListener listener = // ...
googleMap.setInfoWindowAdapter(adapter);
googleMap.setOnInfoWindowClickListener(listener);
If you use MarkerManager
, adding an OnMarkerDragListener
should be done on the MarkerManager.Collection
object.
New
// Create a new Collection from a MarkerManager
MarkerManager markerManager = // ...
MarkerManager.Collection collection = markerManager.newCollection();
// Add markers to collection
MarkerOptions markerOptions = // ...
collection.addMarker(markerOptions);
// ...
// Set OnMarkerDragListener
GoogleMap.OnMarkerDragListener listener = // ...
collection.setOnMarkerDragListener(listener);
// Alternatively, if you are using clustering
ClusterManager<ClusterItem> clusterManager = // ...
MarkerManager.Collection markerCollection = clusterManager.getMarkerCollection();
markerCollection.setOnMarkerDragListener(listener);
Old
// Add markers
MarkerOptions markerOptions = // ...
googleMap.addMarker(makerOptions);
// Add listener
GoogleMap.OnMarkerDragListener listener = // ...
googleMap.setOnMarkerDragListener(listener);
A bug was fixed in v1 to properly clear and re-add markers via the ClusterManager
.
For example, this didn't work pre-v1, but works for v1 and later:
clusterManager.clearItems();
clusterManager.addItems(items);
clusterManager.cluster();
If you're using custom clustering (i.e, if you're extending DefaultClusterRenderer
), you must override two additional methods in v1:
onClusterItemUpdated()
- should be the same* as your onBeforeClusterItemRendered()
methodonClusterUpdated()
- should be the same* as your onBeforeClusterRendered()
method*Note that these methods can't be identical, as you need to use a Marker
instead of MarkerOptions
See the CustomMarkerClusteringDemoActivity
in the demo app for a complete example.
New
private class PersonRenderer extends DefaultClusterRenderer<Person> {
...
@Override
protected void onBeforeClusterItemRendered(Person person, MarkerOptions markerOptions) {
// Draw a single person - show their profile photo and set the info window to show their name
markerOptions
.icon(getItemIcon(person))
.title(person.name);
}
/**
* New in v1
*/
@Override
protected void onClusterItemUpdated(Person person, Marker marker) {
// Same implementation as onBeforeClusterItemRendered() (to update cached markers)
marker.setIcon(getItemIcon(person));
marker.setTitle(person.name);
}
@Override
protected void onBeforeClusterRendered(Cluster<Person> cluster, MarkerOptions markerOptions) {
// Draw multiple people.
// Note: this method runs on the UI thread. Don't spend too much time in here (like in this example).
markerOptions.icon(getClusterIcon(cluster));
}
/**
* New in v1
*/
@Override
protected void onClusterUpdated(Cluster<Person> cluster, Marker marker) {
// Same implementation as onBeforeClusterRendered() (to update cached markers)
marker.setIcon(getClusterIcon(cluster));
}
...
}
Old
private class PersonRenderer extends DefaultClusterRenderer<Person> {
...
@Override
protected void onBeforeClusterItemRendered(Person person, MarkerOptions markerOptions) {
// Draw a single person - show their profile photo and set the info window to show their name
markerOptions
.icon(getItemIcon(person))
.title(person.name);
}
@Override
protected void onBeforeClusterRendered(Cluster<Person> cluster, MarkerOptions markerOptions) {
// Draw multiple people.
// Note: this method runs on the UI thread. Don't spend too much time in here (like in this example).
markerOptions.icon(getClusterIcon(cluster));
}
...
}
Encounter an issue while using this library?
If you find a bug or have a feature request, please file an issue. Or, if you'd like to contribute, send us a pull request and refer to our code of conduct.
You can also reach us on our Discord channel.
For more information, check out the detailed guide on the Google Developers site.