Google 地圖 Android GeoJSON 公用程式

  1. 簡介
  2. 在地圖上新增 GeoJsonLayer
  3. 移除 GeoJsonLayer
  4. 新增及移除 GeoJsonFeature
  5. 存取 GeoJsonFeatures 及其屬性
  6. 設定 GeoJsonLayer 和 GeoJsonFeatures 的樣式
  7. 查看試用版應用程式

簡介

GeoJSON 是 JSON 資料格式的延伸,代表地理資料。您可以使用此公用程式,將地貌儲存為 GeoJSON 格式,再算繪為疊加在地圖上的圖層。如要在地圖中新增或移除 GeoJSON 資料,請分別呼叫 addLayerToMap()removeLayerFromMap()。同樣地,您可以呼叫 addFeature()removeFeature() 並傳入 GeoJsonFeature 物件,以新增或移除個別地圖項目。如果您想要存取地圖項目,可以呼叫 getFeatures() 來取得已加入圖層的所有 GeoJsonFeature 物件疊代。

此外,您也可以設定預設樣式,在地圖項目加到圖層之前先套用。方法是呼叫 getDefaultPointStyle()getDefaultLineStringStyle() getDefaultPolygonStyle(),然後分別為其設定樣式。或者,您也可以針對地圖項目呼叫 setPointStyle()setLineStringStyle()setPolygonStyle() 來設定個別 GeoJsonFeature 的樣式,然後再傳遞相關的樣式物件。

在地圖上新增 GeoJsonLayer

如要在地圖中加入 GeoJson 圖層,請先建立 GeoJsonLayer 類別的例項,目前有兩種方式可以把 GeoJsonLayer 執行個體化。

若要從 JSONObject 匯入,您需要下列項目:

  • GoogleMap 物件,也就是要算繪圖層的地方
  • JSONObject,內含要新增至圖層的 GeoJSON 資料

Java

JSONObject geoJsonData = // JSONObject containing the GeoJSON data
GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);
      

Kotlin

val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data
val layer = GeoJsonLayer(map, geoJsonData)
      

如要從本機 GeoJSON 檔案匯入,您需要下列項目:

  • GoogleMap 物件,也就是要算繪圖層的地方
  • 包含 GeoJSON 資料的本機資源檔案
  • Context 物件,這是開啟本機資源檔案的必要物件

Java

GeoJsonLayer layer = new GeoJsonLayer(map, R.raw.geojson_file, context);
      

Kotlin

val layer = GeoJsonLayer(map, R.raw.geojson_file, context)
      

建立 GeoJsonLayer 後,呼叫 addLayerToMap() 即可將匯入的資料新增至地圖:

Java

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

移除 GeoJsonLayer

假設前提為您已加入這個圖層

Java

JSONObject geoJsonData = // JSONObject containing the GeoJSON data
GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);
      

Kotlin

val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data
val layer = GeoJsonLayer(map, geoJsonData)
      

若要清除 GeoJsonLayer,請呼叫 removeLayerFromMap()

Java

layer.removeLayerFromMap();
      

Kotlin

layer.removeLayerFromMap()
      

新增及移除 GeoJsonFeature

GeoJSON 中的地圖項目類型為「feature」,其中包含幾何圖形、屬性成員,有時也會有定界框或 ID。

您可以單獨建立 GeoJsonFeature 物件,並將其新增至 GeoJsonLayer

假設您建立了一個地圖項目,內含位置在「0, 0」的點,其中有一個屬性項目且沒有定界框。

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);
      

Kotlin

val point = GeoJsonPoint(LatLng(0.0, 0.0))
val properties = hashMapOf("Ocean" to "South Atlantic")
val pointFeature = GeoJsonFeature(point, "Origin", properties, null)
      

如要將地圖項目新增至圖層,請呼叫 addFeature() 並傳遞要加入的地圖項目。

Java

layer.addFeature(pointFeature);
      

Kotlin

layer.addFeature(pointFeature)
      

如要將已新增至圖層的地圖項目移除,請呼叫 removeFeature() 並傳遞要移除的地圖項目。

Java

layer.removeFeature(pointFeature);
      

Kotlin

layer.removeFeature(pointFeature)
      

存取 GeoJsonFeatures 及其屬性

如要存取已新增至圖層的所有 GeoJsonFeatures,您可以在已建立的 GeoJsonLayer 上呼叫 getFeatures()。系統將傳回一個 GeoJsonFeatures 的疊代,您可以使用 for-each 迴圈來存取,如下所示。

Java

for (GeoJsonFeature feature : layer.getFeatures()) {
    // Do something to the feature
}
      

Kotlin

for (feature in layer.features) {
    // Do something to the feature
}
      

搭配 getFeatures() 方法,利用 hasProperty()getProperty() 方法可以檢查每個儲存的地圖項目是否具有特定屬性,而如果有就能存取。

Java

if (feature.hasProperty("Ocean")) {
    String oceanProperty = feature.getProperty("Ocean");
}
      

Kotlin

if (feature.hasProperty("Ocean")) {
    val oceanProperty = feature.getProperty("Ocean")
}
      

GeoJSON 幾何圖形點擊事件

您可以使用 GeoJsonLayer.OnFeatureClickListener() 監聽地圖上幾何圖形地圖項目的點擊事件。以下範例顯示使用者點擊地圖項目時,系統將記錄該地圖項目的標題:

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"));
    }
});
      

Kotlin

// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener { feature ->
    Log.i("GeoJsonClick", "Feature clicked: ${feature.getProperty("title")}")
}
      

設定 GeoJsonLayer 和 GeoJsonFeatures 的樣式

您可以設定 GeoJsonLayer 的預設樣式,或為圖層中的個別地圖項目設定樣式。

預設樣式

在 GeoJsonLayer 中,您可以為已加入圖層的任何點、LineString 和多邊形設定預設樣式。只有當地圖項目的所有幾何圖形都未設定樣式時,系統才會套用預設樣式。您對預設樣式所做的任何變更,也都會反映在套用預設樣式的所有地圖項目上。

套用預設樣式的步驟如下:

  1. 擷取相關的預設樣式物件,可以是 GeoJsonPointStyleGeoJsonLineStringStyleGeoJsonPolygonStyle 任一項。
  2. 針對樣式套用指定選項。

舉例來說,下列程式碼範例說明了如何修改預設的點樣式,讓點變成可拖曳,而且附帶標題和文字片段。

Java

GeoJsonPointStyle pointStyle = layer.getDefaultPointStyle();
pointStyle.setDraggable(true);
pointStyle.setTitle("Hello, World!");
pointStyle.setSnippet("I am a draggable marker");
      

Kotlin

val pointStyle = layer.defaultPointStyle
pointStyle.isDraggable = true
pointStyle.title = "Hello, World!"
pointStyle.snippet = "I am a draggable marker"
      

GeoJsonFeature 專用的樣式

或者,您也可以為圖層中的個別地圖項目設定樣式。針對 GeoJsonFeature 套用樣式的步驟如下:

  1. 建立相關樣式物件,可以是 GeoJsonPointStyleGeoJsonLineStringStyleGeoJsonPolygonStyle
  2. 針對樣式套用指定選項
  3. 將樣式物件傳遞至 GeoJsonFeature 上的相關方法,可能是 setPointStyle()setLineStringStyle()setPolygonStyle()

以下範例說明如何為 GeoJsonFeature 自訂 LineString 樣式,讓顏色變成紅色。

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);
      

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
      

查看試用版應用程式

如需範例瞭解如何從網址匯入 GeoJSON 檔案並以此建立圖層,可以透過公用程式庫隨附的試用版應用程式,參考 GeoJsonDemoActivity 看看。設定指南會示範如何執行試用版應用程式。