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