Google 地圖 Android GeoJSON 公用程式

選取平台: Android iOS JavaScript
  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 資料
KotlinJava


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

     

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

     

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

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


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

     

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

     

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

KotlinJava


layer
.addLayerToMap()

     

layer
.addLayerToMap();

     

移除 GeoJsonLayer

假設您已加入下列圖層

KotlinJava


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

     

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

     

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

KotlinJava


layer
.removeLayerFromMap()

     

layer
.removeLayerFromMap();

     

新增及移除 GeoJsonFeature

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

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

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

KotlinJava


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

     

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

     

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

KotlinJava


layer
.addFeature(pointFeature)

     

layer
.addFeature(pointFeature);

     

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

KotlinJava


layer
.removeFeature(pointFeature)

     

layer
.removeFeature(pointFeature);

     

存取 GeoJsonFeatures 及相關屬性

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

KotlinJava


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

     

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

     

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

KotlinJava


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

     

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

     

GeoJSON 幾何圖形點擊事件

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

KotlinJava


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

     

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

     

設定 GeoJsonLayer 和 GeoJsonFeatures 的樣式

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

預設樣式

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

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

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

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

KotlinJava


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

     

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

     

GeoJsonFeature 專用的樣式

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

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

下例顯示如何為 GeoJsonFeature 自訂 LineString 樣式,讓顏色變成紅色。

KotlinJava


// 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

     

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

     

查看試用版應用程式

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