/
MultipleGeometriesActivity.kt
115 lines (105 loc) · 3.57 KB
/
MultipleGeometriesActivity.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package com.mapbox.maps.testapp.examples.markersandcallouts
import android.graphics.Color
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.mapbox.maps.MapboxMap
import com.mapbox.maps.Style
import com.mapbox.maps.extension.style.expressions.dsl.generated.eq
import com.mapbox.maps.extension.style.layers.addLayer
import com.mapbox.maps.extension.style.layers.generated.*
import com.mapbox.maps.extension.style.sources.addSource
import com.mapbox.maps.extension.style.sources.generated.geoJsonSource
import com.mapbox.maps.logE
import com.mapbox.maps.testapp.databinding.ActivityMultipleGeometriesBinding
import java.net.URISyntaxException
/**
* Example showing drawing several different geometries for one source.
*/
class MultipleGeometriesActivity : AppCompatActivity() {
private lateinit var mapboxMap: MapboxMap
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMultipleGeometriesBinding.inflate(layoutInflater)
setContentView(binding.root)
mapboxMap = binding.mapView.mapboxMap
mapboxMap.loadStyle(
Style.LIGHT
) {
createGeoJsonSource(it)
addPolygonLayer(it)
addLineStringLayer(it)
addPointLayer(it)
}
}
private fun createGeoJsonSource(loadedMapStyle: Style) {
try {
// Load data from GeoJSON file in the assets folder
loadedMapStyle.addSource(
geoJsonSource(GEOJSON_SOURCE_ID) {
data(GEOJSON_SOURCE_URL)
}
)
} catch (exception: URISyntaxException) {
logE(TAG, "Creating geojson source failed ${exception.message}")
}
}
private fun addPolygonLayer(loadedMapStyle: Style) {
// Create and style a FillLayer that uses the Polygon Feature's coordinates in the GeoJSON data
loadedMapStyle.addLayer(
fillLayer(POLYGON_LAYER_ID, GEOJSON_SOURCE_ID) {
fillColor(Color.parseColor("#4469f7"))
fillOpacity(POLYGON_OPACITY)
filter(
eq {
literal("\$type")
literal("Polygon")
}
)
}
)
}
private fun addLineStringLayer(loadedMapStyle: Style) {
// Create and style a LineLayer that uses the Line String Feature's coordinates in the GeoJSON data
loadedMapStyle.addLayer(
lineLayer(LINE_LAYER_ID, GEOJSON_SOURCE_ID) {
lineColor(Color.RED)
lineWidth(LINE_WIDTH)
filter(
eq {
literal("\$type")
literal("LineString")
}
)
}
)
}
private fun addPointLayer(loadedMapStyle: Style) {
// Create and style a Circle layer that uses the Point Feature's coordinates in the GeoJSON data
loadedMapStyle.addLayer(
circleLayer(CIRCLE_LAYER_ID, GEOJSON_SOURCE_ID) {
filter(
eq {
literal("\$type")
literal("Point")
}
)
circleColor(Color.RED)
circleRadius(CIRCLE_RADIUS)
circleStrokeWidth(CIRCLE_STROKE_WIDTH)
circleStrokeColor(Color.BLACK)
}
)
}
companion object {
private val TAG = MultipleGeometriesActivity::class.java.simpleName
private const val GEOJSON_SOURCE_ID = "geojson_sample"
private const val CIRCLE_LAYER_ID = "circle-layer"
private const val LINE_LAYER_ID = "line_string"
private const val POLYGON_LAYER_ID = "polygon"
private const val GEOJSON_SOURCE_URL = "asset://multiple_geometry_example.geojson"
private const val LINE_WIDTH = 2.0
private const val CIRCLE_RADIUS = 6.0
private const val CIRCLE_STROKE_WIDTH = 2.0
private const val POLYGON_OPACITY = 0.3
}
}