- Giới thiệu
- Thêm GeoJsonLayer vào bản đồ
- Xoá GeoJsonLayer
- Thêm và xoá một GeoJsonFeature
- Truy cập vào GeoJsonFeatures và các thuộc tính của chúng
- Tạo kiểu cho GeoJsonLayer và GeoJsonFeatures
- Xem ứng dụng minh hoạ
Giới thiệu
GeoJSON là một phần mở rộng của định dạng dữ liệu JSON và đại diện cho dữ liệu địa lý. Khi sử dụng tiện ích này, bạn có thể lưu trữ các đặc điểm địa lý ở định dạng GeoJSON và hiển thị chúng dưới dạng một lớp trên đầu bản đồ. Để thêm và xoá dữ liệu GeoJSON của bạn khỏi bản đồ và ngược lại, hãy gọi addLayerToMap()
và removeLayerFromMap()
tương ứng. Tương tự như vậy, bạn có thể thêm và xoá từng tính năng bằng cách gọi addFeature()
và removeFeature()
rồi truyền vào đối tượng GeoJsonFeature
. Nếu muốn truy cập các tính năng, bạn có thể gọi getFeatures()
để có thể lặp lại tất cả đối tượng
GeoJsonFeature
đã được thêm vào lớp.
Bạn cũng có thể đặt kiểu mặc định để áp dụng cho các đối tượng trước khi chúng được thêm vào lớp, bằng cách gọi getDefaultPointStyle()
, getDefaultLineStringStyle()
hoặc
getDefaultPolygonStyle()
và đặt các tuỳ chọn kiểu trên mỗi đối tượng.
Ngoài ra, bạn có thể đặt kiểu cho từng GeoJsonFeature
bằng cách gọi setPointStyle()
, setLineStringStyle()
hoặc setPolygonStyle()
trên tính năng này và truyền vào đối tượng kiểu có liên quan.
Thêm GeoJsonLayer vào bản đồ của bạn
Để thêm một lớp GeoJson vào bản đồ, trước tiên, hãy tạo một thực thể của lớp GeoJsonLayer. Có hai cách để tạo thực thể cho GeoJsonLayer.
Để nhập từ JSONObject
, bạn cần có:
- Đối tượng
GoogleMap
trong đó lớp sẽ được kết xuất JSONObject
chứa dữ liệu GeoJSON sẽ được thêm vào lớp
Kotlin
val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data val layer = GeoJsonLayer(map, geoJsonData)
Java
JSONObject geoJsonData = // JSONObject containing the GeoJSON data GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);
Để nhập từ một tệp GeoJSON cục bộ, bạn cần:
- Đối tượng
GoogleMap
trong đó lớp sẽ được kết xuất - Tệp tài nguyên cục bộ chứa dữ liệu GeoJSON
- Đối tượng
Context
(bắt buộc phải có để mở tệp tài nguyên cục bộ)
Kotlin
val layer = GeoJsonLayer(map, R.raw.geojson_file, context)
Java
GeoJsonLayer layer = new GeoJsonLayer(map, R.raw.geojson_file, context);
Sau khi bạn tạo GeoJsonLayer
, hãy gọi addLayerToMap()
để thêm dữ liệu đã nhập vào bản đồ:
Kotlin
layer.addLayerToMap()
Java
layer.addLayerToMap();
Xoá GeoJsonLayer
Giả sử rằng bạn đã thêm lớp này
Kotlin
val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data val layer = GeoJsonLayer(map, geoJsonData)
Java
JSONObject geoJsonData = // JSONObject containing the GeoJSON data GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);
Để xoá GeoJsonLayer, hãy gọi removeLayerFromMap()
Kotlin
layer.removeLayerFromMap()
Java
layer.removeLayerFromMap();
Thêm và xoá GeoJsonFeature
Một tính năng trong GeoJSON có loại "feature". Lớp này chứa một hình học, một thành phần thuộc tính và có thể có một hộp giới hạn hoặc một mã nhận dạng.
Bạn có thể tạo từng đối tượng GeoJsonFeature
rồi thêm các đối tượng đó vào GeoJsonLayer
.
Giả sử bạn đã tạo một đối tượng chứa một điểm tại 0, 0 với một mục nhập trong thuộc tính và không có hộp giới hạn.
Kotlin
val point = GeoJsonPoint(LatLng(0.0, 0.0)) val properties = hashMapOf("Ocean" to "South Atlantic") val pointFeature = GeoJsonFeature(point, "Origin", properties, null)
Java
GeoJsonPoint point = new GeoJsonPoint(new LatLng(0, 0)); HashMap<String, String> properties = new HashMap<>(); properties.put("Ocean", "South Atlantic"); GeoJsonFeature pointFeature = new GeoJsonFeature(point, "Origin", properties, null);
Để thêm đối tượng vào lớp, hãy gọi addFeature()
và truyền vào đối tượng để thêm.
Kotlin
layer.addFeature(pointFeature)
Java
layer.addFeature(pointFeature);
Để xoá một đối tượng sau khi thêm đối tượng đó vào lớp, hãy gọi removeFeature()
và truyền vào đối tượng đó để xoá.
Kotlin
layer.removeFeature(pointFeature)
Java
layer.removeFeature(pointFeature);
Truy cập vào GeoJsonFeatures và các thuộc tính của chúng
Để truy cập tất cả các GeoJsonFeatures đã được thêm vào lớp, bạn có thể gọi getFeatures()
trên GeoJsonLayer
mà bạn đã tạo. Thao tác này sẽ trả về một giá trị lặp lại (iterable) của GeoJsonFeatures
mà bạn có thể truy cập bằng cách sử dụng một vòng lặp cho mỗi vòng lặp như minh hoạ dưới đây.
Kotlin
for (feature in layer.features) { // Do something to the feature }
Java
for (GeoJsonFeature feature : layer.getFeatures()) { // Do something to the feature }
Sử dụng các phương thức hasProperty()
và getProperty()
kết hợp với phương thức getFeatures()
để kiểm tra xem mỗi tính năng được lưu trữ có một thuộc tính cụ thể hay không và truy cập vào thuộc tính đó nếu có.
Kotlin
if (feature.hasProperty("Ocean")) { val oceanProperty = feature.getProperty("Ocean") }
Java
if (feature.hasProperty("Ocean")) { String oceanProperty = feature.getProperty("Ocean"); }
Sự kiện nhấp chuột GeoJSON Geometry
Bạn có thể sử dụng GeoJsonLayer.OnFeatureClickListener()
để theo dõi các sự kiện nhấp chuột đối với các đối tượng hình học trên bản đồ. Ví dụ sau đây sẽ ghi lại tiêu đề của một tính năng khi người dùng nhấp vào tính năng đó:
Kotlin
// Set a listener for geometry clicked events. layer.setOnFeatureClickListener { feature -> Log.i("GeoJsonClick", "Feature clicked: ${feature.getProperty("title")}") }
Java
// Set a listener for geometry clicked events. layer.setOnFeatureClickListener(new Layer.OnFeatureClickListener() { @Override public void onFeatureClick(Feature feature) { Log.i("GeoJsonClick", "Feature clicked: " + feature.getProperty("title")); } });
Tạo kiểu cho GeoJsonLayer và GeoJsonFeatures
Bạn có thể đặt kiểu mặc định cho GeoJsonLayer hoặc tạo kiểu cho từng đối tượng trong lớp.
Kiểu mặc định
Trong GeoJsonLayer, bạn có thể đặt kiểu mặc định cho mọi điểm, chuỗi đường và đa giác được thêm vào lớp này. Kiểu mặc định chỉ được áp dụng nếu đối tượng chưa đặt kiểu cho một trong các hình của đối tượng này. Mọi thay đổi bạn thực hiện đối với kiểu mặc định cũng sẽ được phản ánh trong tất cả các tính năng đang sử dụng kiểu mặc định.
Các bước để áp dụng kiểu mặc định như sau
- Truy xuất đối tượng kiểu mặc định có liên quan, đối tượng này có thể là một trong các
GeoJsonPointStyle
,GeoJsonLineStringStyle
hoặcGeoJsonPolygonStyle
. - Áp dụng các tuỳ chọn bạn muốn cho kiểu.
Ví dụ: mã mẫu sau đây cho biết cách sửa đổi kiểu điểm mặc định, giúp bạn có thể kéo các điểm bằng tiêu đề và đoạn mã.
Kotlin
val pointStyle = layer.defaultPointStyle pointStyle.isDraggable = true pointStyle.title = "Hello, World!" pointStyle.snippet = "I am a draggable marker"
Java
GeoJsonPointStyle pointStyle = layer.getDefaultPointStyle(); pointStyle.setDraggable(true); pointStyle.setTitle("Hello, World!"); pointStyle.setSnippet("I am a draggable marker");
Kiểu dành riêng cho GeoJsonFeature
Ngoài ra, bạn có thể tạo kiểu cho các đối tượng riêng lẻ trong lớp. Các bước để áp dụng một kiểu trên GeoJsonFeature
như sau.
- Tạo đối tượng kiểu có liên quan, đối tượng này có thể là
GeoJsonPointStyle
,GeoJsonLineStringStyle
hoặcGeoJsonPolygonStyle
. - Áp dụng các tuỳ chọn bạn muốn cho kiểu.
- Truyền đối tượng kiểu vào phương thức có liên quan trên
GeoJsonFeature
. Phương thức này sẽ làsetPointStyle()
,setLineStringStyle()
hoặcsetPolygonStyle()
.
Ví dụ: đây là cách tuỳ chỉnh kiểu chuỗi dòng cho GeoJsonFeature
để màu của chuỗi có màu đỏ.
Kotlin
// Create a new feature containing a linestring val lineStringArray: MutableList<LatLng> = ArrayList() lineStringArray.add(LatLng(0.0, 0.0)) lineStringArray.add(LatLng(50.0, 50.0)) val lineString = GeoJsonLineString(lineStringArray) val lineStringFeature = GeoJsonFeature(lineString, null, null, null) // Set the color of the linestring to red val lineStringStyle = GeoJsonLineStringStyle() lineStringStyle.color = Color.RED // Set the style of the feature lineStringFeature.lineStringStyle = lineStringStyle
Java
// Create a new feature containing a linestring List<LatLng> lineStringArray = new ArrayList<LatLng>(); lineStringArray.add(new LatLng(0, 0)); lineStringArray.add(new LatLng(50, 50)); GeoJsonLineString lineString = new GeoJsonLineString(lineStringArray); GeoJsonFeature lineStringFeature = new GeoJsonFeature(lineString, null, null, null); // Set the color of the linestring to red GeoJsonLineStringStyle lineStringStyle = new GeoJsonLineStringStyle(); lineStringStyle.setColor(Color.RED); // Set the style of the feature lineStringFeature.setLineStringStyle(lineStringStyle);
Xem ứng dụng minh hoạ
Để xem ví dụ về cách nhập tệp GeoJSON từ URL và tạo một lớp với tệp đó, hãy xem GeoJsonDemoActivity
trong ứng dụng minh hoạ đi kèm với thư viện tiện ích. Hướng dẫn thiết lập sẽ cho bạn biết cách chạy ứng dụng minh hoạ.