Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import org.json.JSONException
import org.json.JSONObject
import java.io.IOException
import java.io.InputStream
import java.util.Observer

@Deprecated("Use the new platform-agnostic data layer and renderer instead.")
public class GeoJsonLayer : Layer {
Expand All @@ -40,8 +41,11 @@ public class GeoJsonLayer : Layer {
private var mRenderer: MapViewRenderer? = null
private var mIsLayerOnMap = false
private val mFeatureMap = HashMap<GeoJsonFeature, com.google.maps.android.data.renderer.model.Feature>()
private val mModelToLegacyFeatures = HashMap<com.google.maps.android.data.renderer.model.Feature, GeoJsonFeature>()
private val mModelToLegacyFeatures = java.util.IdentityHashMap<com.google.maps.android.data.renderer.model.Feature, GeoJsonFeature>()
private var mFeatureClickListener: OnFeatureClickListener? = null
private val mFeatureObserver = Observer { observable, _ ->
if (observable is GeoJsonFeature) onFeatureChanged(observable)
}

public interface GeoJsonOnFeatureClickListener : OnFeatureClickListener

Expand Down Expand Up @@ -122,6 +126,7 @@ public class GeoJsonLayer : Layer {
}
}

mFeatures.forEach { it.addObserver(mFeatureObserver) }
// Calculate bounding box
calculateBoundingBox()
}
Expand Down Expand Up @@ -230,17 +235,15 @@ public class GeoJsonLayer : Layer {
override fun addLayerToMap() {
val renderer = mRenderer ?: return
mFeatures.forEach { feature ->
val modelFeature = toModelFeature(feature)
renderer.addFeature(modelFeature)
if (feature.getGeometry() != null) renderer.addFeature(toModelFeature(feature))
}
mIsLayerOnMap = true
}

override fun removeLayerFromMap() {
val renderer = mRenderer ?: return
mFeatures.forEach { feature ->
val modelFeature = toModelFeature(feature)
renderer.removeFeature(modelFeature)
mFeatureMap[feature]?.let { renderer.removeFeature(it) }
}
mIsLayerOnMap = false
}
Expand Down Expand Up @@ -284,6 +287,18 @@ public class GeoJsonLayer : Layer {
)
}

is com.google.maps.android.data.renderer.model.MultiGeometry -> {
if (geometry is GeoJsonMultiPolygon) {
val polygonStyle = feature.polygonStyle ?: mDefaultPolygonStyle
com.google.maps.android.data.renderer.model.PolygonStyle(
fillColor = polygonStyle.fillColor,
strokeColor = polygonStyle.getStrokeColor(),
strokeWidth = polygonStyle.getStrokeWidth(),
geodesic = polygonStyle.isGeodesic(),
)
} else null
}

else -> {
null
}
Expand Down Expand Up @@ -350,14 +365,18 @@ public class GeoJsonLayer : Layer {
get() = mFeatures

public fun addFeature(feature: GeoJsonFeature) {
mFeatures.add(feature)
if (mIsLayerOnMap) {
if (!mFeatures.contains(feature)) {
mFeatures.add(feature)
feature.addObserver(mFeatureObserver)
}
if (mIsLayerOnMap && feature.getGeometry() != null) {
mRenderer?.addFeature(toModelFeature(feature))
}
}

public fun removeFeature(feature: GeoJsonFeature) {
mFeatures.remove(feature)
if (!mFeatures.remove(feature)) return
feature.deleteObserver(mFeatureObserver)
val modelFeature = mFeatureMap.remove(feature)
if (modelFeature != null) {
mModelToLegacyFeatures.remove(modelFeature)
Expand All @@ -367,6 +386,17 @@ public class GeoJsonLayer : Layer {
}
}

private fun onFeatureChanged(feature: GeoJsonFeature) {
mFeatureMap.remove(feature)?.let { oldModel ->
mModelToLegacyFeatures.remove(oldModel)
if (mIsLayerOnMap) mRenderer?.removeFeature(oldModel)
}
if (mFeatures.contains(feature) && feature.getGeometry() != null) {
val updatedModel = toModelFeature(feature)
if (mIsLayerOnMap) mRenderer?.addFeature(updatedModel)
}
}

override fun setOnFeatureClickListener(listener: OnFeatureClickListener) {
mFeatureClickListener = listener
mGoogleMap?.let { map ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import com.google.maps.android.data.renderer.IconProvider
import com.google.maps.android.data.renderer.model.DataLayer
import com.google.maps.android.data.renderer.model.DataScene
import com.google.maps.android.data.renderer.model.Feature
import com.google.maps.android.data.renderer.model.Geometry
import com.google.maps.android.data.renderer.model.GroundOverlay
import com.google.maps.android.data.renderer.model.GroundOverlayStyle
import com.google.maps.android.data.renderer.model.LineString
Expand Down Expand Up @@ -108,10 +109,22 @@ class MapViewRenderer(
}

override fun addFeature(feature: Feature) {
removeFeature(feature)
val mapObjects = mutableListOf<Any>()
when (feature.geometry) {
renderGeometry(feature, feature.geometry, mapObjects)
if (mapObjects.isNotEmpty()) {
renderedFeatures[feature] = mapObjects
}
}

private fun renderGeometry(
feature: Feature,
geometry: Geometry,
mapObjects: MutableList<Any>,
) {
when (geometry) {
is PointGeometry -> {
val point = feature.geometry.point
val point = geometry.point
val style = feature.style as? PointStyle
if (useAdvancedMarkers) {
val markerOptions = createAdvancedMarkerOptions(point, style, feature.properties)
Expand Down Expand Up @@ -159,30 +172,26 @@ class MapViewRenderer(
}

is LineString -> {
val lineString = feature.geometry
val style = feature.style as? LineStyle
val polylineOptions = createPolylineOptions(lineString, style)
val polylineOptions = createPolylineOptions(geometry, style)
mapObjects.add(map.addPolyline(polylineOptions))
}

is Polygon -> {
val polygon = feature.geometry
val style = feature.style as? PolygonStyle
val polygonOptions = createPolygonOptions(polygon, style)
val polygonOptions = createPolygonOptions(geometry, style)
mapObjects.add(map.addPolygon(polygonOptions))
}

is MultiGeometry -> {
feature.geometry.geometries.forEach { geometry ->
// Recursively add each geometry in the MultiGeometry
addFeature(feature.copy(geometry = geometry))
geometry.geometries.forEach { childGeometry ->
renderGeometry(feature, childGeometry, mapObjects)
}
}

is GroundOverlay -> {
val groundOverlay = feature.geometry
val style = feature.style as? GroundOverlayStyle
val options = createGroundOverlayOptions(groundOverlay, style)
val options = createGroundOverlayOptions(geometry, style)

style?.iconUrl?.let { url ->
val localBitmap = localImages[url]
Expand Down Expand Up @@ -223,9 +232,6 @@ class MapViewRenderer(
}
}
}
if (mapObjects.isNotEmpty()) {
renderedFeatures[feature] = mapObjects
}
}

override fun removeFeature(feature: Feature) {
Expand Down
Loading