亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

ArcGIS for Android地圖控件常見操作

2019-11-09 17:32:47
字體:
來源:轉載
供稿:網友

GIS的開發中,什么時候都少不了地圖操作。ArcGIS for Android中,地圖組件就是MapView,MapView是基于Android中ViewGroup的一個類(參考),也是ArcGIS Runtime SDK for Android中的地圖容器,與很多ArcGIS API中的Map、MapControl類的作用是一樣的。

    地圖常見的操作有縮放、旋轉、平移、獲取范圍、比例尺、分辨率等信息,以及常用的手勢操作,其中,經常使用到的功能和常見問題有以下幾個:

1)將地圖縮放到指定的比例尺/分辨率/級別;

2)設置地圖的最大最小縮放級別;

3)獲取地圖上某點的經緯度坐標;

4)地圖的手勢操作;

5)地圖無法顯示。

    下面內容會為您詳細解答以上問題。

 

1、獲取/設置比例尺、分辨率、中心點、范圍;

    ArcGIS forAndroid中,MapView具有很多與地圖操作有關的方法,其中,與地圖的比例尺、分辨率、中心點、范圍有關的方法如下:

 

獲取/設置地圖的中心點、范圍、分辨率、比例尺

返回類型

方法

說明

Void

centerAt(Point centerPt, Boolean animated)

將地圖居中到指定的點

Point

getCenter()

獲取地圖中心點

Polygon

getExtent()

獲取地圖最小外包矩形

Envelope

getMapBoundaryExtent()

獲取地圖的邊界

Void

setExtent(Geometry geometry)

將地圖放大到指定的范圍,并將該geometry的bound作為地圖當前的extent

Void

setExtent(Geometry geometry, int padding)

將地圖放大到指定的geometry以便geometry適應地圖的bound

Double

getMaxResolution()

獲取地圖最大分辨率

Void

setMaxResolution(double maxResolution)

設置地圖最大分辨率

Double

getMinResolution()

獲取地圖最小分辨率

Void

setMinResolution(double minResolution)

設置地圖最小分辨率

Double

getResolution()

獲取當前地圖分辨率

Void

setResolution(double res)

設置當前地圖分辨率

Double

getScale()

獲取當前地圖比例尺

Void

setScale(double scale)

設置當前地圖比例尺

    

    要獲取/設置地圖的比例尺、初始分辨率、范圍、中心點等信息,直接使用上述方法即可,非常簡單,在此不贅述,示例代碼如下:

map.setScale(18489297.737236);//設置地圖初始化時的比例尺;

map.setAllowRotationByPinch(true);//設置是否允許地圖通過pinch方式旋轉;

map.setRotationAngle(15.0);//設置地圖的旋轉角度;

……

 

2、地圖縮放、平移和旋轉;

 

與縮放和旋轉有關的地圖事件如下:

                                                                                                            地圖縮放、旋轉

返回類型

方法

說明

Void

zoomin()

 

Void

zoomout()

 

Void

zoomTo(Point centerPt, float factor)

將地圖放大到指定點

Void

zoomToResolution(Point centerPt, double res)

將地圖放大到指定分辨率

Void

zoomToScale(Point centerPt, double scale)

將地圖放大到指定比例尺

Double

getRotationAngle()

返回當前地圖旋轉角度(單位degree)

Void

setRotationAngle(double degree)

將地圖按照指定的角度(單位degree)旋轉,度數為正數則按逆時針方向旋轉

Void

setRotationAngle(double degree, float pivotX, float pivotY)

將地圖按指定的點和角度旋轉,角度為正數按逆時針

Void

setAllowRotationByPinch(boolean allowRotationByPinch)

允許/取消pinch旋轉

Boolean

isAllowRotationByPinch()

是否允許pinch時旋轉

 

2.1 平移

    MapView的方法中,沒有專門針對平移操作,主要原因在于,MapView中已經默認支持平移操作,即使用鼠標或手勢拖動地圖時就會平移地圖,所以無需設置;

 

2.2 縮放至指定的分辨率/比例尺和連續放大n倍

    一般的切片地圖服務,在其REST服務的目錄下都能查到切片的等級、等級對應的分辨率和比例尺,每個等級之間的分辨率和比例尺之間呈2倍的關系。    ArcGIS Android中沒有像Web中的那種指針控件,沒有直接的地圖級別的控制,通常級別控制通過分辨率或比例尺來實現??梢杂胓etResolution()和getscale()方法獲取當前地圖的比例尺和分辨率,然后利用2的倍數關系,使用zoomTo()/zoomToScale()/zoomToResolution()來達到“控制地圖縮放級別”的目的:

 放大/縮小1倍:

map.zoomin()、map.zoomout();

連續放大/縮小n倍:

map.zoomTo(point centerPt, float factor);如:map.zoomTo(centerPt,2n),其中,n為放大或縮小的倍數;

map.zoomToScale(Point centerPt, double scale) ;如:map.zoomToScale(centerPt, map.getScale()/2n)/map.zoomToScale(pt,map.getScale()*2n),其中,n為放大或縮小的倍數;

map.zoomToResolution(point centerPt, double res):map.zoomToResolution(centerPt,map.getResolution()/2n)/map.zoomToResolution(centerPt,map.getResolution() *2n),其中,n為放大或縮小的倍數;

    在zoomTo(point centerPt, float factor)中,centerPt指在哪個點放大,factor參數用來計算新的分辨率,計算公式為:新的分辨率 = 當前分辨率/factor。這個意思也就是說,想在當前分辨率下放大3倍,則新分辨率 = 當前分辨率/(23),因為每一級之間分辨率呈2的倍數關系,放大三級,分辨率就是23倍,factor =23。 從上圖中可以看出,地圖級別每增加1級,分辨率/2,比例尺/2,故如果想將地圖連續放大n級,factor =2n。如果想將地圖連續縮小n級,則 factor =2-n。

    在zooToScale(Point centerPt, double scale)和zoomToResolution(point centerPt, double res)中,scale和res都指實際的分辨率和比例尺,故按照2的倍數關系直接乘除即可。

 

2.3 設置地圖最大最小縮放級別

 有時候我們需要設置地圖放大或縮小到某個級別之后,不允許用戶再放大或縮小,用以下兩個方法很容易做到:

    map.setMaxResolution(MaxResolution);

    map.setMinResolution(MinResolution);

     這兩個方法設置了地圖的最大、最小分辨率,也就限制了地圖的縮放級別,當地圖達到最大、最小分辨率時,地圖將不能再被縮小或者放大,以免用戶無限制的縮放地圖或看到更多的內容。

在初始化時將地圖設定為某種級別(找到該級別對應的分辨率、比例尺):

         map.setResolution(該級別對應的分辨率); 

 至于如何獲取當前地圖等級,沒辦法,先獲取resolution,然后去rest服務目錄中對照取其級別吧。

 

2.4 旋轉地圖

 

    可以使用setRotationAngle(double degree)和setRotationAngle(doubledegree, float pivotX, float pivotY)來實現將地圖旋轉一定的角度,要實現通過手勢進行旋轉,需要通過setOnPinchListener(OnPinchListener onPinchListener)監聽來實現。如:

 

public void onCreate(Bundle savedInstanceState, OnPinchListener onPinchListener) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

 

map = (MapView)findViewById(R.id.map);

……

map.setAllowRotationByPinch(true); //是否允許使用Pinch方式旋轉地圖

map.setRotationAngle(15.0); //初始化時將地圖旋轉15度,參數為正時按逆時針方向旋轉。

}

 

 

3、獲取地圖上某點的坐標

 

    獲取地圖上某點的坐標主要使用下列幾個方法,其中,主要使用toMapPoint()方法實現獲取地圖上的點坐標信息:

返回類型

方法

說明

SpatialReference

getSpatialReference()

返回地圖的坐標系統

Point

toMapPoint(float screenx, float screeny)

將屏幕坐標轉換成地圖坐標系下的ArcGIS geometry Point坐標

Point

toMapPoint(Point src)

將屏幕坐標轉換成地圖坐標系下的ArcGIS geometry Point坐標

Point

toScreenPoint(Point src)

將地圖坐標系下的ArcGIS geometry Point坐標轉換成屏幕坐標

 

 

    如,在長按地圖時獲取鼠標點的坐標代碼如下:

//      長按顯示鼠標點坐標及比例尺

        this.map.setOnLongPRessListener(new OnLongPressListener() {

            private static final long serialVersionUID = 1L;

            @Override

            public void onLongPress(float x,float y) {

                com.esri.core.geometry.Point pt = map.toMapPoint(x, y);

                mapcenter.setText("X:"+ pt.getX() +"Y:"+ pt.getY());

                labelxy.setText("當前地圖分辨率為:" +map.getResolution());

                mapscale.setText("當前地圖比例尺為:" +map.getScale());  

            }

        });

 

    運行結果如下:

 

4、手勢操作

 

    默認情況下,MapView響應以下手勢:

1)單一手指雙擊和pinch-out放大地圖;

2)兩個或多個手指pinch-in縮小地圖;

3)單個手指拖拽平移地圖。

 

    其它手勢監聽有:

手勢事件

返回類型

方法/事件監聽

說明

OnLongPressListener

getOnLongPressListener()

獲取地圖長按事件監聽

OnPanListener

getOnPanListener()

獲取地圖平移事件監聽

OnPinchListener

getOnPinchListener()

獲取地圖捏夾事件監聽

OnSingleTapListener

getOnSingleTapListener()

獲取地圖單擊事件監聽

OnZoomListener

getOnZoomListener()

獲取縮放監聽

void

setOnLongPressListener(OnLongPressListener onLongPressListener)

設置地圖長按事件監聽

Void

setOnPanListener(OnPanListener onPanListener)

設置地圖平移事件監聽

Void

setOnPinchListener(OnPinchListener onPinchListener)

設置地圖捏夾事件監聽

Void

setOnSingleTapListener(OnSingleTapListener onSingleTapListener)

設置地圖單擊事件監聽

Void

setOnZoomListener(OnZoomListener onZoomListener)

設置縮放監聽

 

5、關于地圖顯示不出來的問題

    許多新手在使用ArcGIS RuntimeSDk for Android開發時,最簡單的HelloWorld程序都會遇到問題,按照教程的步驟,添加了MapView,添加了切片圖層,一切就緒,地圖卻始終出不來,遇到這個問題可先從以下幾個方面查找原因:

 

1)如果添加了多個圖層,請確保多個圖層的地理參考一致;

2)是服務類型是否對應;

3)圖層聲明在xml布局文件中;

4)如果只是添加了一個底圖圖層仍然出不來底圖,那么十有八九是extent的問題。首先,MapView控件必須至少包含一個圖層,其次,該圖層最好為其指定initExtent,在xml中代碼如下:

 

    <com.esri.android.map.MapView

        android:id="@+id/map"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        initExtent="-20037507.0672, -30240971.9584, 20037507.0672, 30240971.9584">

    </com.esri.android.map.MapView>

 

 

         該initExtent來自哪里呢?還是地圖服務目錄中:

 

 

    取兩個中的任一個,或者自定義一個包含于上述兩個范圍中的extent均可,推薦使用full extent。

 

 

6、其它常用方法

 

             除了上述提到的各種方法和監聽之外,還有一些與地圖相關的,也比較常用的方法和監聽如下:

 

其它屬性和事件

返回類型

方法/事件監聽

說明

OnStatusChangedListener

getOnStatusChangedListener()

獲取地圖狀態改變事件監聽

Void

setOnStatusChangedListener(OnStatusChangedListeneronStatusChangedListener)

設置地圖狀態改變事件監聽

Boolean

isLoaded()

MapView初始化之后返回true

Void

setEsriLogoVisible(Boolean visible)

打開或關閉地圖上的ESRI的logo標簽

Void

setMapBackground(int bkColor, int gridColor, float gridSize, float gridLineSize)

設置地圖背景顏色


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文国产成人精品| 欧美夫妻性生活xx| 中文字幕日韩综合av| 高清日韩电视剧大全免费播放在线观看| 亚洲日本中文字幕免费在线不卡| 日韩在线视频免费观看| 国产精品一区二区三| 九色精品美女在线| 亚洲午夜色婷婷在线| 日韩av片永久免费网站| 有码中文亚洲精品| 国产精品揄拍500视频| 亚洲视频在线观看网站| 亚洲91精品在线观看| 日韩av一区二区在线观看| 亚洲精品日韩丝袜精品| 亚洲精品二三区| 欧美一乱一性一交一视频| 97视频在线免费观看| 国产suv精品一区二区| 欧美大尺度激情区在线播放| 欧美日韩国产成人在线观看| 亚洲第一网站男人都懂| 日韩av电影在线免费播放| 亚洲尤物视频网| 亚洲福利影片在线| 欧美成人剧情片在线观看| 亚洲欧美日韩综合| 国产精品偷伦一区二区| 亚洲国产97在线精品一区| 在线观看欧美日韩| 国产中文字幕日韩| 亚洲人免费视频| 午夜精品久久久久久久99热浪潮| 亲爱的老师9免费观看全集电视剧| 伊人av综合网| 国产亚洲综合久久| 欧美极品少妇xxxxⅹ免费视频| 国产精品久久久久高潮| 成人在线小视频| 日韩网站免费观看| 伊人伊成久久人综合网站| 久久97精品久久久久久久不卡| 日韩高清电影免费观看完整版| 日韩电影中文 亚洲精品乱码| 精品福利在线观看| 国产精品中文在线| 久久久欧美精品| 精品国产乱码久久久久久虫虫漫画| 北条麻妃久久精品| 日韩欧美国产中文字幕| 一区二区三区久久精品| 精品国内亚洲在观看18黄| 青草青草久热精品视频在线网站| 成人精品aaaa网站| 萌白酱国产一区二区| 国产精品444| 一本色道久久88综合亚洲精品ⅰ| 日韩av电影在线网| 欧美精品videossex88| 国产精品狠色婷| 91精品国产高清久久久久久91| 91日本在线视频| 亚洲国产精品悠悠久久琪琪| 日韩欧美中文第一页| 亚洲毛茸茸少妇高潮呻吟| 91在线视频一区| 97avcom| 国产亚洲a∨片在线观看| 国产精品www网站| 国产精品电影在线观看| 国产精品久久久久7777婷婷| 欧美精品video| 性色av一区二区三区红粉影视| 国产精品免费一区二区三区都可以| 国产精品久久久久久久天堂| 久久露脸国产精品| 欧美在线亚洲一区| www.亚洲人.com| 日韩最新免费不卡| 国产91精品久久久| 欧美日韩国产一区在线| www.日韩免费| 亚洲精品有码在线| 97在线观看视频| 97激碰免费视频| 久久99久久99精品免观看粉嫩| 色婷婷综合久久久久| 亚洲一区二区在线播放| 69国产精品成人在线播放| 久久久久久久一区二区三区| 亚洲xxxx在线| 中文字幕亚洲字幕| 欧美日韩在线看| 福利视频第一区| 国产精品激情av在线播放| **欧美日韩vr在线| 欧美大学生性色视频| 久久免费成人精品视频| 最新69国产成人精品视频免费| 亚洲天堂成人在线视频| 国产69久久精品成人看| 久久亚洲精品视频| 日韩欧美在线网址| 日韩电影视频免费| 亚洲人成网站999久久久综合| 中文字幕日韩精品在线| 国产日韩欧美另类| 91久久精品国产91性色| 亚洲人成在线观| 国产精品国产自产拍高清av水多| 久久久免费观看视频| 久久视频精品在线| 久久精品国产清自在天天线| 亚洲视频电影图片偷拍一区| 最新国产精品亚洲| 欧美超级乱淫片喷水| 欧美午夜宅男影院在线观看| 亚洲第一区在线| 伊人男人综合视频网| 成人在线视频网| 法国裸体一区二区| 国内精品久久久久久久| 日韩成人网免费视频| 亚洲精品综合久久中文字幕| 亚洲欧美日韩久久久久久| 国产精品成人aaaaa网站| 午夜精品视频网站| 福利视频第一区| 欧美亚洲激情视频| 国产亚洲精品va在线观看| 久久久久久久久久国产精品| 国产精品久久久久久亚洲影视| 亚洲成人网在线观看| 久久青草精品视频免费观看| 久久全球大尺度高清视频| 亚洲乱码一区二区| 欧美激情综合色综合啪啪五月| 亚洲天堂第二页| 亚洲肉体裸体xxxx137| 成人看片人aa| 日韩精品中文字幕有码专区| 欧美黄色成人网| 2021国产精品视频| 精品国产欧美成人夜夜嗨| 操日韩av在线电影| 欧美影院成年免费版| 亚洲视频777| 5278欧美一区二区三区| 欧美日韩亚洲视频一区| 国产精品亚洲精品| 久久久久久久久中文字幕| 少妇高潮久久77777| 国产精品免费一区二区三区都可以| 精品综合久久久久久97| 精品国产福利在线| 欧亚精品在线观看| 97视频在线免费观看| 国产精品a久久久久久| 国产综合在线看| 久久久久久尹人网香蕉| 国产aⅴ夜夜欢一区二区三区| 国产精品a久久久久久| 国产成人中文字幕|