麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 系統(tǒng) > Android > 正文

ArcGIS for Android地圖控件常見操作

2019-11-09 17:32:47
字體:
供稿:網(wǎng)友

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

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

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

2)設(shè)置地圖的最大最小縮放級(jí)別;

3)獲取地圖上某點(diǎn)的經(jīng)緯度坐標(biāo);

4)地圖的手勢(shì)操作;

5)地圖無(wú)法顯示。

    下面內(nèi)容會(huì)為您詳細(xì)解答以上問題。

 

1、獲取/設(shè)置比例尺、分辨率、中心點(diǎn)、范圍;

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

 

獲取/設(shè)置地圖的中心點(diǎn)、范圍、分辨率、比例尺

返回類型

方法

說明

Void

centerAt(Point centerPt, Boolean animated)

將地圖居中到指定的點(diǎn)

Point

getCenter()

獲取地圖中心點(diǎn)

Polygon

getExtent()

獲取地圖最小外包矩形

Envelope

getMapBoundaryExtent()

獲取地圖的邊界

Void

setExtent(Geometry geometry)

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

Void

setExtent(Geometry geometry, int padding)

將地圖放大到指定的geometry以便geometry適應(yīng)地圖的bound

Double

getMaxResolution()

獲取地圖最大分辨率

Void

setMaxResolution(double maxResolution)

設(shè)置地圖最大分辨率

Double

getMinResolution()

獲取地圖最小分辨率

Void

setMinResolution(double minResolution)

設(shè)置地圖最小分辨率

Double

getResolution()

獲取當(dāng)前地圖分辨率

Void

setResolution(double res)

設(shè)置當(dāng)前地圖分辨率

Double

getScale()

獲取當(dāng)前地圖比例尺

Void

setScale(double scale)

設(shè)置當(dāng)前地圖比例尺

    

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

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

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

map.setRotationAngle(15.0);//設(shè)置地圖的旋轉(zhuǎn)角度;

……

 

2、地圖縮放、平移和旋轉(zhuǎn);

 

與縮放和旋轉(zhuǎn)有關(guān)的地圖事件如下:

                                                                                                            地圖縮放、旋轉(zhuǎn)

返回類型

方法

說明

Void

zoomin()

 

Void

zoomout()

 

Void

zoomTo(Point centerPt, float factor)

將地圖放大到指定點(diǎn)

Void

zoomToResolution(Point centerPt, double res)

將地圖放大到指定分辨率

Void

zoomToScale(Point centerPt, double scale)

將地圖放大到指定比例尺

Double

getRotationAngle()

返回當(dāng)前地圖旋轉(zhuǎn)角度(單位degree)

Void

setRotationAngle(double degree)

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

Void

setRotationAngle(double degree, float pivotX, float pivotY)

將地圖按指定的點(diǎn)和角度旋轉(zhuǎn),角度為正數(shù)按逆時(shí)針

Void

setAllowRotationByPinch(boolean allowRotationByPinch)

允許/取消pinch旋轉(zhuǎn)

Boolean

isAllowRotationByPinch()

是否允許pinch時(shí)旋轉(zhuǎn)

 

2.1 平移

    MapView的方法中,沒有專門針對(duì)平移操作,主要原因在于,MapView中已經(jīng)默認(rèn)支持平移操作,即使用鼠標(biāo)或手勢(shì)拖動(dòng)地圖時(shí)就會(huì)平移地圖,所以無(wú)需設(shè)置;

 

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

    一般的切片地圖服務(wù),在其REST服務(wù)的目錄下都能查到切片的等級(jí)、等級(jí)對(duì)應(yīng)的分辨率和比例尺,每個(gè)等級(jí)之間的分辨率和比例尺之間呈2倍的關(guān)系。    ArcGIS Android中沒有像Web中的那種指針控件,沒有直接的地圖級(jí)別的控制,通常級(jí)別控制通過分辨率或比例尺來實(shí)現(xiàn)。可以用getResolution()和getscale()方法獲取當(dāng)前地圖的比例尺和分辨率,然后利用2的倍數(shù)關(guān)系,使用zoomTo()/zoomToScale()/zoomToResolution()來達(dá)到“控制地圖縮放級(jí)別”的目的:

 放大/縮小1倍:

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

連續(xù)放大/縮小n倍:

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

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

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

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

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

 

2.3 設(shè)置地圖最大最小縮放級(jí)別

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

    map.setMaxResolution(MaxResolution);

    map.setMinResolution(MinResolution);

     這兩個(gè)方法設(shè)置了地圖的最大、最小分辨率,也就限制了地圖的縮放級(jí)別,當(dāng)?shù)貓D達(dá)到最大、最小分辨率時(shí),地圖將不能再被縮小或者放大,以免用戶無(wú)限制的縮放地圖或看到更多的內(nèi)容。

在初始化時(shí)將地圖設(shè)定為某種級(jí)別(找到該級(jí)別對(duì)應(yīng)的分辨率、比例尺):

         map.setResolution(該級(jí)別對(duì)應(yīng)的分辨率); 

 至于如何獲取當(dāng)前地圖等級(jí),沒辦法,先獲取resolution,然后去rest服務(wù)目錄中對(duì)照取其級(jí)別吧。

 

2.4 旋轉(zhuǎn)地圖

 

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

 

public void onCreate(Bundle savedInstanceState, OnPinchListener onPinchListener) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

 

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

……

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

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

}

 

 

3、獲取地圖上某點(diǎn)的坐標(biāo)

 

    獲取地圖上某點(diǎn)的坐標(biāo)主要使用下列幾個(gè)方法,其中,主要使用toMapPoint()方法實(shí)現(xiàn)獲取地圖上的點(diǎn)坐標(biāo)信息:

返回類型

方法

說明

SpatialReference

getSpatialReference()

返回地圖的坐標(biāo)系統(tǒng)

Point

toMapPoint(float screenx, float screeny)

將屏幕坐標(biāo)轉(zhuǎn)換成地圖坐標(biāo)系下的ArcGIS geometry Point坐標(biāo)

Point

toMapPoint(Point src)

將屏幕坐標(biāo)轉(zhuǎn)換成地圖坐標(biāo)系下的ArcGIS geometry Point坐標(biāo)

Point

toScreenPoint(Point src)

將地圖坐標(biāo)系下的ArcGIS geometry Point坐標(biāo)轉(zhuǎn)換成屏幕坐標(biāo)

 

 

    如,在長(zhǎng)按地圖時(shí)獲取鼠標(biāo)點(diǎn)的坐標(biāo)代碼如下:

//      長(zhǎng)按顯示鼠標(biāo)點(diǎn)坐標(biāo)及比例尺

        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("當(dāng)前地圖分辨率為:" +map.getResolution());

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

            }

        });

 

    運(yùn)行結(jié)果如下:

 

4、手勢(shì)操作

 

    默認(rèn)情況下,MapView響應(yīng)以下手勢(shì):

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

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

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

 

    其它手勢(shì)監(jiān)聽有:

手勢(shì)事件

返回類型

方法/事件監(jiān)聽

說明

OnLongPressListener

getOnLongPressListener()

獲取地圖長(zhǎng)按事件監(jiān)聽

OnPanListener

getOnPanListener()

獲取地圖平移事件監(jiān)聽

OnPinchListener

getOnPinchListener()

獲取地圖捏夾事件監(jiān)聽

OnSingleTapListener

getOnSingleTapListener()

獲取地圖單擊事件監(jiān)聽

OnZoomListener

getOnZoomListener()

獲取縮放監(jiān)聽

void

setOnLongPressListener(OnLongPressListener onLongPressListener)

設(shè)置地圖長(zhǎng)按事件監(jiān)聽

Void

setOnPanListener(OnPanListener onPanListener)

設(shè)置地圖平移事件監(jiān)聽

Void

setOnPinchListener(OnPinchListener onPinchListener)

設(shè)置地圖捏夾事件監(jiān)聽

Void

setOnSingleTapListener(OnSingleTapListener onSingleTapListener)

設(shè)置地圖單擊事件監(jiān)聽

Void

setOnZoomListener(OnZoomListener onZoomListener)

設(shè)置縮放監(jiān)聽

 

5、關(guān)于地圖顯示不出來的問題

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

 

1)如果添加了多個(gè)圖層,請(qǐng)確保多個(gè)圖層的地理參考一致;

2)是服務(wù)類型是否對(duì)應(yīng);

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

4)如果只是添加了一個(gè)底圖圖層仍然出不來底圖,那么十有八九是extent的問題。首先,MapView控件必須至少包含一個(gè)圖層,其次,該圖層最好為其指定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來自哪里呢?還是地圖服務(wù)目錄中:

 

 

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

 

 

6、其它常用方法

 

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

 

其它屬性和事件

返回類型

方法/事件監(jiān)聽

說明

OnStatusChangedListener

getOnStatusChangedListener()

獲取地圖狀態(tài)改變事件監(jiān)聽

Void

setOnStatusChangedListener(OnStatusChangedListeneronStatusChangedListener)

設(shè)置地圖狀態(tài)改變事件監(jiān)聽

Boolean

isLoaded()

MapView初始化之后返回true

Void

setEsriLogoVisible(Boolean visible)

打開或關(guān)閉地圖上的ESRI的logo標(biāo)簽

Void

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

設(shè)置地圖背景顏色


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 九九久久视频 | 激情久久一区二区 | 日本免费不卡一区二区 | 成人不卡 | 久久性生活免费视频 | 免费观看的毛片手机视频 | 石原莉奈日韩一区二区三区 | 日韩字幕 | 男男啪羞羞视频网站 | 97zyz成人免费视频 | 黄色片在线观看网站 | 亚洲视频在线网 | 日韩视频―中文字幕 | 久久精品国产99国产精品亚洲 | 日本黄色大片免费 | 欧美日韩爱爱视频 | 92看片淫黄大片一级 | av在线免费观看中文字幕 | 麻豆一二区 | 杏美月av| 久久精品视频12 | 免费小毛片 | 久久影院在线观看 | 日韩视频在线视频 | 成人在线观看一区二区三区 | 精品人成 | 538任你躁在线精品视频网站 | 中国字幕av | 一级毛片在线免费播放 | 欧美a级毛片| 久久2019中文字幕 | 欧美a黄 | 亚洲成人国产 | 99riav国产在线观看 | 中文字幕www | 日韩视频观看 | 午夜精品久久久久久久99热浪潮 | 青青草好吊色 | 97超碰资源站 | 毛片视频免费观看 | 国产精品视频中文字幕 |