- 簡介
- 在地圖上新增 GeoJsonLayer
- 移除 GeoJsonLayer
- 新增及移除 GeoJsonFeature
- 存取 GeoJsonFeatures 及其屬性
- 設定 GeoJsonLayer 和 GeoJsonFeatures 的樣式
- 查看試用版應用程式
簡介
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 資料
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);
如要從本機 GeoJSON 檔案匯入,您需要下列項目:
GoogleMap
物件,也就是要算繪圖層的地方- 包含 GeoJSON 資料的本機資源檔案
Context
物件,這是開啟本機資源檔案的必要物件
Kotlin
val layer = GeoJsonLayer(map, R.raw.geojson_file, context)
Java
GeoJsonLayer layer = new GeoJsonLayer(map, R.raw.geojson_file, context);
建立 GeoJsonLayer
後,呼叫 addLayerToMap()
即可將匯入的資料新增至地圖:
Kotlin
layer.addLayerToMap()
Java
layer.addLayerToMap();
移除 GeoJsonLayer
假設您已加入下列圖層
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);
如要清除 GeoJsonLayer,請呼叫 removeLayerFromMap()
Kotlin
layer.removeLayerFromMap()
Java
layer.removeLayerFromMap();
新增及移除 GeoJsonFeature
GeoJSON 中的地圖項目類型為「feature」,其中包含幾何圖形、屬性成員,有時也會有定界框或 ID。
您可以單獨建立 GeoJsonFeature
物件,並將其新增至 GeoJsonLayer
。
假設您已建立一個地圖項目,內含位置在「0, 0」的點,屬性中有一個項目,且沒有定界框。
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);
如要將地圖項目新增至圖層,請呼叫 addFeature()
並傳遞要加入的地圖項目。
Kotlin
layer.addFeature(pointFeature)
Java
layer.addFeature(pointFeature);
如要將已新增至圖層的地圖項目移除,請呼叫 removeFeature()
並傳遞要移除的地圖項目。
Kotlin
layer.removeFeature(pointFeature)
Java
layer.removeFeature(pointFeature);
存取 GeoJsonFeatures 及相關屬性
如要存取已新增至圖層的所有 GeoJsonFeatures,您可以在已建立的 GeoJsonLayer
上呼叫 getFeatures()
。系統將傳回一個 GeoJsonFeatures
的疊代,您可以使用 for-each 迴圈來存取,如下所示。
Kotlin
for (feature in layer.features) { // Do something to the feature }
Java
for (GeoJsonFeature feature : layer.getFeatures()) { // Do something to the feature }
將 getFeatures()
方法與 hasProperty()
和 getProperty()
方法結合,可以檢查每個儲存的地圖項目是否具有特定屬性,而如果有就能進行存取。
Kotlin
if (feature.hasProperty("Ocean")) { val oceanProperty = feature.getProperty("Ocean") }
Java
if (feature.hasProperty("Ocean")) { String oceanProperty = feature.getProperty("Ocean"); }
GeoJSON 幾何圖形點擊事件
您可以使用 GeoJsonLayer.OnFeatureClickListener()
監聽地圖上幾何圖形地圖項目的點擊事件。下例顯示使用者點選地圖項目時,系統會記錄該地圖項目的標題:
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")); } });
設定 GeoJsonLayer 和 GeoJsonFeatures 的樣式
您可以設定 GeoJsonLayer 的預設樣式,或為圖層中的個別地圖項目設定樣式。
預設樣式
在 GeoJsonLayer 中,您可以為已加入圖層的任何點、LineString 和多邊形設定預設樣式。只有當地圖項目的所有幾何圖形都未設定樣式時,系統才會套用預設樣式。您對預設樣式所做的任何變更,也都會反映在套用預設樣式的所有地圖項目上。
套用預設樣式的步驟如下:
- 擷取相關的預設樣式物件,可以是
GeoJsonPointStyle
、GeoJsonLineStringStyle
或GeoJsonPolygonStyle
任一項。 - 針對樣式套用指定選項。
舉例來說,下列程式碼範例說明如何修改預設的點樣式,讓點變成可拖曳,而且附帶標題和文字片段。
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");
GeoJsonFeature 專用的樣式
或者,您也可以為圖層中的個別地圖項目設定樣式。將樣式套用到 GeoJsonFeature
的步驟如下:
- 建立相關樣式物件,可以是
GeoJsonPointStyle
、GeoJsonLineStringStyle
或GeoJsonPolygonStyle
。 - 針對樣式套用指定選項。
- 將樣式物件傳遞至
GeoJsonFeature
上的相關方法,可以是setPointStyle()
、setLineStringStyle()
或setPolygonStyle()
。
下例顯示如何為 GeoJsonFeature
自訂 LineString 樣式,讓顏色變成紅色。
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);
查看試用版應用程式
如需範例瞭解如何從網址匯入 GeoJSON 檔案並以此建立圖層,可以透過公用程式庫隨附的試用版應用程式,參考 GeoJsonDemoActivity
看看。設定指南會示範如何執行試用版應用程式。