Tiện ích GeoJSON dành cho Android của Google Maps

Chọn nền tảng: Android iOS JavaScript
  1. Giới thiệu
  2. Thêm GeoJsonLayer vào bản đồ
  3. Xoá GeoJsonLayer
  4. Thêm và xoá một GeoJsonFeature
  5. Truy cập vào GeoJsonFeatures và các thuộc tính của chúng
  6. Tạo kiểu cho GeoJsonLayer và GeoJsonFeatures
  7. 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()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()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()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

  1. 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ặc GeoJsonPolygonStyle.
  2. Á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.

  1. Tạo đối tượng kiểu có liên quan, đối tượng này có thể là GeoJsonPointStyle, GeoJsonLineStringStyle hoặc GeoJsonPolygonStyle.
  2. Áp dụng các tuỳ chọn bạn muốn cho kiểu.
  3. 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ặc setPolygonStyle().

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ạ.