昨天看完了線段 Polyline,接著要看的是常用在繪製地籍或坵塊的多邊形 (Polygon)。
多邊形跟線段一樣,都是由數個經緯度組成,只是多邊形屬於封閉的線段,且會形成內部封閉的區域。
繪製多邊形的邏輯跟線段一樣:
PolygonOptions
調整樣式GoogleMap.addPolygon(PolygonOptions)
繪製並取得 Polygon
物件。/**
* 基本款 Polygon
*
* @param map
*/
private fun addSimplePolygon(map: GoogleMap) {
val polygonList = listOf(
LatLng(24.1607, 120.6404),
LatLng(24.1620, 120.6386),
LatLng(24.1630, 120.6384),
LatLng(24.1638, 120.6390),
LatLng(24.1636, 120.6402),
LatLng(24.1644, 120.6412),
LatLng(24.1631, 120.6424),
LatLng(24.1623, 120.6416),
LatLng(24.1607, 120.6404)
)
val polygonOptions = PolygonOptions()
.addAll(polygonList)
map.addPolygon(polygonOptions)
}
上面範例的第一筆與最後一筆經緯度相同,但其實即便第一筆與最後一筆不相同,API 會自動補最後一位,讓多邊形封閉起來。
addHole()
如果是中間有空洞的多邊形,需要使用 addHole()
這個方法,把空洞的經緯度點位加進去。
/**
* 中間有空洞的 Polygon
*
* @param map
*/
private fun addPolygonWithHole(map: GoogleMap) {
val hole = listOf(
LatLng(24.1623, 120.6392),
LatLng(24.1627, 120.6412),
LatLng(24.1615, 120.6407),
)
val polygonList = listOf(
LatLng(24.1607, 120.6404),
LatLng(24.1620, 120.6386),
LatLng(24.1630, 120.6384),
LatLng(24.1638, 120.6390),
LatLng(24.1636, 120.6402),
LatLng(24.1644, 120.6412),
LatLng(24.1631, 120.6424),
LatLng(24.1623, 120.6416),
LatLng(24.1607, 120.6404)
)
val polygonOptions = PolygonOptions()
.addAll(polygonList)
.addHole(hole)
.fillColor(Color.GREEN)
map.addPolygon(polygonOptions)
}
已加入的 Polygon
跟 Polyline
一樣,可以呼叫 setPoints()
更新 Polygon。
PolygonOptions.fillColor()
fillColor()
的效果不影響,hole
中空的部分,因為中空本來就不會填滿。
另外,fillColor()
的顏色支援不透明。
設定多邊形框線的顏色。
PolygonOptions.strokeColor()
設定多邊形框線的寬度。
PolygonOptions.strokeWidth(20f)
設定多邊形框線的轉折處。
PolygonOptions.strokeJointType(JointType.ROUND)
設定多邊形框線的 Pattern。
PolygonOptions.strokePattern(listOf(Dash(20F), Gap(5f)))
/**
* 帶有樣式的 Polygon
*
* @param map
*/
private fun addPolygonWithStyle(map: GoogleMap) {
val hole = listOf(
LatLng(24.1623, 120.6392),
LatLng(24.1627, 120.6412),
LatLng(24.1615, 120.6407),
)
val polygonList = listOf(
LatLng(24.1607, 120.6404),
LatLng(24.1620, 120.6386),
LatLng(24.1630, 120.6384),
LatLng(24.1638, 120.6390),
LatLng(24.1636, 120.6402),
LatLng(24.1644, 120.6412),
LatLng(24.1631, 120.6424),
LatLng(24.1623, 120.6416),
LatLng(24.1607, 120.6404)
)
val polygonOptions = PolygonOptions()
.addAll(polygonList)
.addHole(hole)
// 填滿顏色
.fillColor(Color.parseColor("#90bd4a55"))
// 線段顏色
.strokeColor(Color.GREEN)
// 線段寬度
.strokeWidth(20f)
// 線段圓角
.strokeJointType(JointType.ROUND)
// 線段 Pattern
.strokePattern(listOf(Dash(10F), Gap(30f)))
map.addPolygon(polygonOptions)
}
多邊形跟線段一樣,預設沒有啟用點擊事件,如果需要啟用,要呼叫 Polygon.setClickable(true)
來啟用。
監聽事件是使用 OnPolygonClickListener,呼叫GoogleMap.setOnPolygonClickListener(OnPolygonClickListener)
加入。
以上就是今天的多邊形 Polygon 介紹,操作上跟線段很像,可以變化的外觀設定很多,大家可以根據自身的設計需求多嘗試看看,也歡迎留言討論~
明天見!!
您好,我嘗試著將數千個Polygon繪製在google maps上,但這會造成地圖lag導致移動不順暢,想詢問一下該如何解決呢?謝謝您
建議您使用範圍篩選的方式來繪製 Polygon。
GoogleMap.getProjection().getVisibleRegion().latLngBounds;
取得螢幕可視的地圖範圍。這樣應該可以避免大量繪製導致的效能問題,提升地圖操作的流暢度。
非常感謝您的回答,流暢度有明顯的大幅提升!!