1. 程式人生 > >google map 接入指南——map 詳解

google map 接入指南——map 詳解

講解Google map類基本用法和使用場景

map model 地圖模型

學習google map,我們要知道其思想是通過建立一些模型和實體概念來簡化相關認識。

BitmapDescriptor 定義點陣圖影象。 
BitmapDescriptorFactory 用於建立點陣圖影象的定義,用於標記圖示和地面疊加。 
ButtCap Polyline 實線筆劃圖案的開始或結束頂點處準確平方的頂點,相當於在開始或結束頂點之外沒有額外的頂點。 
CameraPosition 一個不可變類,它聚合所有攝像機位置引數,例如位置,縮放級別,傾斜角度和方位。 
CameraPosition.Builder 建立相機位置。 
Cap 不可變的上限可以應用於a的起點或終點Polyline。 
Circle 地球表面上的一個圓圈(球冠)。 
CircleOptions 定義a的選項Circle。 
CustomCap
點陣圖疊加以a的起始或結束頂點為中心Polyline,根據線的第一個或最後一個邊的方向定向,並相對於線的筆劃寬度進行縮放。 
Dash 表示為一個行程圖案中使用短劃線不可變類Polyline 或一的輪廓Polygon 或Circle。 
Dot 表示為一個行程圖案中的點的不可變類Polyline 或一的輪廓Polygon 或Circle。 
Gap 表示用於在行程模式中使用的間隙的不可變類
Polyline
 或一的輪廓Polygon 或Circle。 
GroundOverlay 地面疊加層是固定在地圖上的影象。 
的GroundOverlayOptions 定義地面疊加層的選項。 
IndoorBuilding 代表一座建築。 
IndoorLevel 表示建築物中的水平。 
JointType 聯合型別Polyline 和概述Polygon。 
LatLng 表示一對緯度和經度座標的不可變類,以度為單位儲存。 
的LatLngBounds 表示緯度/經度對齊矩形的不可變類。 
LatLngBounds.Builder 這是一個能夠根據一組LatLng點建立最小邊界的構建器。 
MapStyleOptions 為a定義樣式選項GoogleMap。 
Marker 放置在地圖表面特定點的圖示。 
的MarkerOptions 為標記定義MarkerOptions。 
PatternItem 在一個行程模式使用一成不變的專案 Polyline 或輪廓Polygon 或Circle。 
PointOfInterest 包含有關單擊的PointOfInterest的資訊。 
Polygon 地球表面的多邊形。 
的PolygonOptions 定義多邊形的選項。 
Polyline 折線是一個點列表,其中線段在連續點之間繪製。 
的PolylineOptions 定義折線的選項。 
RoundCap 半徑等於行程寬度一半的半圓形帽,Polyline 以實線筆劃圖案的起點或終點為中心。 
SquareCap 在將筆畫寬度的一半延伸到Polyline 具有實線筆劃圖案的開始或結束頂點之後,將其平方。 
StreetViewPanoramaCamera 一個聚合所有攝像機位置引數的不可變類。 
StreetViewPanoramaCamera.Builder 構建全景相機。 
StreetViewPanoramaLink 一個不可變類,表示指向另一個街景全景圖的連結。 
StreetViewPanoramaLocation 一個不可變類,包含使用者當前街景全景圖的詳細資訊  
StreetViewPanoramaOrientation 一個聚合所有使用者視點引數的不可變類。 
StreetViewPanoramaOrientation.Builder 構建街景全景方向。 
StreetViewSource 用於將街景搜尋限制為選定來源的識別符號。 
Tile 包含有關由a返回的Tile的資訊TileProvider。 
TileOverlay 平鋪疊加是一組影象,顯示在基本地圖圖塊的頂部。 
TileOverlayOptions 定義TileOverlay的選項。 
UrlTileProvider 部分實現TileProvider 只需要指向要提供的影象的URL。 
VisibleRegion 包含定義在地圖相機中可見的四邊形多邊形的四個點。 

mapView 上的一些UI 就是對應上面的各種model,那我們瞭解這些模型相關的api,就能大致知道如何去運用地圖了。比如如何新增相關model,及相關事件處理;


 

基本用法

  1. 畫線:
    private static final Dash DASH = new Dash(50);
        private static final Gap GAP = new Gap(20);
        private static final List<PatternItem> PATTERN_DASHED = Arrays.asList(DASH, GAP);
    
    mPolyline = mMap.addPolyline(new PolylineOptions()
                    .add(latLng, new LatLng(latLng.latitude, toRadiusLatLng(latLng, 200).longitude))
                    .color(getResources().getColor(R.color.colorAccent))
                    .width(10)
                    //短線 50 點為DOT 沒有長度單位
                    .pattern(PATTERN_DASHED)
                    .zIndex(2)
                    .clickable(true));

     

  2. 標記marker
     mCenterMarker = mMap.addMarker(new MarkerOptions()
                    .position(latLng)
    //系統標記圖示                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))
                    .draggable(true)
                    .zIndex(2)
                    .title("detection marker"));
    
    //也可以換成自己的Bitmap
    .icon(BitmapDescriptorFactory.fromBitmap(getBitmap(xx))

     

  3. 多邊形
     

          mMutablePolygon = map.addPolygon(new PolygonOptions()
                    .addAll(createRectangle(CENTER, 5, 5))
                    .addHole(createRectangle(new LatLng(-22, 128), 1, 1))
                    .addHole(createRectangle(new LatLng(-18, 133), 0.5, 1.5))
                    .fillColor(fillColorArgb)
                    .strokeColor(strokeColorArgb)
                    .strokeWidth(mStrokeWidthBar.getProgress())
                    .clickable(mClickabilityCheckbox.isChecked()));
    
      就是多個線連線起來的

     

圓形
 

 mCircle = mMap.addCircle(new CircleOptions()
                .center(new LatLng(latLng.latitude , latLng.longitude))
                .radius(200)
                .strokeWidth(5)
                .strokeColor(getResources().getColor(R.color.detectionCircle))
                //填充色為透明
                .fillColor(0x220000FF)
                .zIndex(2)
                .clickable(true));

 


UI Settings 設定

文件說明;該類只要控制地圖介面上的UI 控制元件和一些手勢動作,這裡對一些重要的類做一些解析:

boolean isCompassEnabled()

Gets whether the compass is enabled/disabled.

boolean isIndoorLevelPickerEnabled()

Gets whether the indoor level picker is enabled/disabled.

boolean isMapToolbarEnabled()

Gets whether the Map Toolbar is enabled/disabled.

boolean isMyLocationButtonEnabled()

Gets whether the my-location button is enabled/disabled.

boolean isRotateGesturesEnabled()

Gets whether rotate gestures are enabled/disabled.

boolean isScrollGesturesEnabled()

Gets whether scroll gestures are enabled/disabled.

boolean isTiltGesturesEnabled()

Gets whether tilt gestures are enabled/disabled.

boolean isZoomControlsEnabled()

Gets whether the zoom controls are enabled/disabled.

boolean isZoomGesturesEnabled()

Gets whether zoom gestures are enabled/disabled.

void setAllGesturesEnabled(boolean enabled)

Sets the preference for whether all gestures should be enabled or disabled.

void setCompassEnabled(boolean enabled)

Enables or disables the compass.

void setIndoorLevelPickerEnabled(boolean enabled)

Sets whether the indoor level picker is enabled when indoor mode is enabled.

void setMapToolbarEnabled(boolean enabled)

Sets the preference for whether the Map Toolbar should be enabled or disabled.

void setMyLocationButtonEnabled(boolean enabled)

Enables or disables the my-location button.

void setRotateGesturesEnabled(boolean enabled)

Sets the preference for whether rotate gestures should be enabled or disabled.

void setScrollGesturesEnabled(boolean enabled)

Sets the preference for whether scroll gestures should be enabled or disabled.

void setTiltGesturesEnabled(boolean enabled)

Sets the preference for whether tilt gestures should be enabled or disabled.

void setZoomControlsEnabled(boolean enabled)

Enables or disables the zoom controls.

void setZoomGesturesEnabled(boolean enabled)

Sets the preference for whether zoom gestures should be enabled or disabled.


一般的,我們是在地圖載入成功後,進行map的UI Setting 設定,如:

    @SuppressLint("MissingPermission")
    private void initMapSetting() {
        mMap.getUiSettings().setAllGesturesEnabled(true);
        //mMap.getUiSettings().setZoomControlsEnabled(true);
        mMap.getUiSettings().setCompassEnabled(false);
        mMap.getUiSettings().setMyLocationButtonEnabled(true);
        //禁止右下角的兩個系統圖標
        mMap.getUiSettings().setMapToolbarEnabled(false);
        //定位功能開啟
        mMap.setMyLocationEnabled(true);
        //定位按鈕點選事件
        mMap.setOnMyLocationButtonClickListener(this);
        mMap.setOnCameraChangeListener(this);
    }

    @SuppressLint("MissingPermission")
    private void forbidMapOperation() {
        mMap.getUiSettings().setAllGesturesEnabled(false);
        //mMap.getUiSettings().setZoomControlsEnabled(false);
        mMap.getUiSettings().setMyLocationButtonEnabled(false);

        mMap.setMyLocationEnabled(false);
        mMap.setOnMyLocationButtonClickListener(null);

        mMap.setOnCameraChangeListener(this);

    }

比如說 展現羅盤,縮放按鈕,定位按鈕,手勢操作等設定。


回撥事件

文件說明;主要常用的有  On(Map,Marker,Circle,MyLocationButton--定位按鈕,Polygon--多邊形,Polyline--線,InfoWindow--字型資訊)ClickListener ,OnMapLongClickListener ,OnMarkerDragListener,onCameraChangeListener(相機位置和屬性改變後);這些回撥的規律是:圍繞一些地圖上的模型點選,移動,長按的事件進行回撥;

縮放和移動的 文件說明 ;google地圖的縮放級別從1(洲)——20(街道);注意縮放其實是相機的視角變化,並不是地圖本身進行縮放,這一點對於移動也是,移動本身不是mapView的移動,而是地圖上方的相機進行移動,這一點是地圖和相機的關係,理解這一點很重要。

更改縮放級別並設定最小/最大縮放

CameraUpdateFactory.zoomIn()並 CameraUpdateFactory.zoomOut() 給你一個CameraUpdate改變縮放級別1.0,同時保持所有其他屬性相同。

CameraUpdateFactory.zoomTo(float) 為您提供一個CameraUpdate將縮放級別更改為給定值,同時保持所有其他屬性相同的值。

CameraUpdateFactory.zoomBy(float) 並 CameraUpdateFactory.zoomBy(float, Point) 給你一個CameraUpdate增加(或減少,如果值為負)的縮放級別給定的值。後者固定螢幕上的給定點,使得它保持在相同的位置(緯度/經度),因此它可以改變相機的位置以實現此目的。

您可能會發現設定首選的最小和/或最大縮放級別很有用。例如,如果您的應用顯示感興​​趣點周圍的已定義區域,或者您使用的是具有有限縮放級別的自定義圖塊疊加層,則此功能可用於控制使用者的體驗。

設定縮放範圍:

mMap.setMinZoomPreference(6.0f);
mMap.setMaxZoomPreference(14.0f);

改變相機位置

常見的位置變化有兩種方便的方法。 CameraUpdateFactory.newLatLng(LatLng) 給你一個CameraUpdate改變相機的經度和經度,同時保留所有其他屬性。 CameraUpdateFactory.newLatLngZoom(LatLng, float) 為您提供CameraUpdate更改相機的緯度,經度和變焦,同時保留所有其他屬性。

為了在更改攝像機位置時具有完全的靈活性,使用 CameraUpdateFactory.newCameraPosition(CameraPosition)CameraUpdate可以將攝像機移動到給定位置。A CameraPosition可以直接獲得,使用 new CameraPosition()CameraPosition.Builder使用 new CameraPosition.Builder()

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()), 15));

平移(滾動)

CameraUpdateFactory.scrollBy(float, float)為您提供一個CameraUpdate更改相機的緯度和經度,使地圖按指定的畫素數移動。正x值會使攝像機向右移動,以使地圖看起來向左移動。正y值會使相機向下移動,以使地圖看起來向上移動。相反,負x值會導致相機向左移動,因此地圖似乎已向右移動,負y值會導致相機向上移動。滾動是相對於相機的當前方向。例如,如果攝像機的軸承為90度,則向東“向上”。

onCameraChangeListener 

這個回撥很重要,我們的很多邏輯可以在這裡處理,現在此方法已被廢棄,被以下回調替代

 

 

  • GoogleMap.OnCameraMoveStartedListener
  • GoogleMap.OnCameraMoveListener
  • GoogleMap.OnCameraIdleListener

目前先寫這麼多了,後面繼續增加地圖區域設定,電子圍欄功能使用。