zoukankan      html  css  js  c++  java
  • Arcgis for Androd API开发系列教程(一)——地图显示与GPS定位

    序:最近呢,工作鸭梨不是怎么大,对于自己爱折腾的想法又冒出了水面,开始自己的android开发的学习之旅。但是呢,本人是做GIS的,所以呢,就打算从这方面入手看看,是不是有什么比较好玩的玩意呢,这才导致了“Arcgis for Androd API开发系列教程”的成功问世……


    本篇呢,是用“Arcgis for Androd API”实现基本的地图显示并在图上显示当前GPS所在位置。为了比较直观的让大家看看本人的成果呢,先给大家上账图吧:

    软件效果图

    看见了吧,人所在的位置呢就是本人所处的位置……知道要做什么了之后,下面给大家说一下具体的实现方法吧。


    在做Arcgis for Android API开发之前,你得做一件大事,那就是搭建Android的开发环境,至于怎么搭建,我在此就不再说了,本来没打算说这玩意的。安卓开发环境搭建完成之后了,你需要需要安装 ArcGIS 发相关的库和 Eclipse插件了,这个的安装呢,你可以选择在线的安装方式,也可以选择离线的安装方式,在线的比较简单,Eclipse菜单/help/Install New Softwear...,在弹出的框框里面输入http://downloads.esri.com/software/arcgis/android即可,离线的更省事,不过你本机得有ArcGISAndroidSDK_v????.zip,没有的那别着急,你可以去网站上找,不想找的呢,我呢也给大家共享了,下载地址为:http://download.csdn.net/detail/gisshixisheng/6703689,大家按需下载,不受积分的。


    靠,废话一大堆,终于到主题了!上面的工作完成之后呢,首先你得新建一个Arcgis for Android的工程,暂且就叫做MapGps吧,建成之后文件组织形式如下:


    我想,做过安卓开发或者了解安卓开发的人呢对着玩意肯定不陌生吧,具体的我也不做解释,有疑问的我们可以私聊,最好是美女……不过呢,有些东西呢,还是交代一下吧:

    1、src

    这个东东我不怎么清楚,个人认为类似于web开发的后台

    2、libs

    这个是开发相关的类库

    3、res

    英语差不多的人应该明白,res是resources的简写,是“资源”的意思。其中,darwable命名的文件夹是一些图片文件,layout是一些布局文件,values是一些值文件,里面包括string,color等等……这个layout类似于web的前台吧……


    首先,来看看main.xml文件的内容:

    <?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
        
        <!-- MapView layout and initial extent -->
        <com.esri.android.map.MapView
      		android:id="@+id/map"
      		android:layout_width="fill_parent"
      		android:layout_height="fill_parent">
      	</com.esri.android.map.MapView>
      	
      	<com.esri.arcgis.android.samples.helloworld.ZoomControlView
            android:id="@+id/ZoomControlView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="20.0dip"
            android:layout_marginRight="5.0dip"/>
    
      	<ZoomControls
      	    android:id="@+id/zoomCtrl"
      	    android:layout_width="wrap_content"
      	    android:layout_height="wrap_content"
      	    android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:layout_marginTop="20.0dip"
            android:layout_marginRight="5.0dip" />
    
      	<android.widget.SearchView
      	    android:id="@+id/searchView"
      	    android:layout_width="wrap_content"
      	    android:layout_height="wrap_content"
      	    android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_marginTop="20.0dip"
            android:layout_marginLeft="5.0dip" />
    
      	<Button
      	    android:id="@+id/btnGps"
      	    android:layout_width="wrap_content"
      	    android:layout_height="wrap_content"
      	    android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_marginBottom="20.0dip"
            android:layout_marginLeft="5.0dip"
      	    android:text="GPS" />
      	
    </RelativeLayout>
    

    接着,看看HelloWorld.java的内容:

    /* Copyright 2012 ESRI
     *
     * All rights reserved under the copyright laws of the United States
     * and applicable international laws, treaties, and conventions.
     *
     * You may freely redistribute and use this sample code, with or
     * without modification, provided you include the original copyright
     * notice and use restrictions.
     *
     * See the �Sample code usage restrictions� document for further information.
     *
     */
    
    package com.esri.arcgis.android.samples.helloworld;
    
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Context;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ZoomControls;
    
    import com.esri.android.map.GraphicsLayer;
    import com.esri.android.map.MapView;
    import com.esri.android.map.ags.ArcGISTiledMapServiceLayer;
    import com.esri.core.geometry.GeometryEngine;
    import com.esri.core.geometry.Point;
    import com.esri.core.geometry.SpatialReference;
    import com.esri.core.map.Graphic;
    import com.esri.core.symbol.PictureMarkerSymbol;
    
    public class HelloWorld extends Activity {
    	Button zoomin;
    	Button zoomout;	
    	Button btnGps;
    	ZoomControls zoomctrl;
    	LocationManager locMag;
    	Location loc ;
    	
    	MapView map = null;
    	ArcGISTiledMapServiceLayer tileLayer;
    	GraphicsLayer gLayerPos; 
    	Point point;
    	Point wgspoint;
    	Point mapPoint;
    	PictureMarkerSymbol locationSymbol;
    	
    	ZoomControlView mZoomControlView;
    	
    	/** Called when the activity is first created. */
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		
    		map = (MapView)findViewById(R.id.map);
    		
    		tileLayer = new ArcGISTiledMapServiceLayer(
    				"http://cache1.arcgisonline.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer");
    		
    		map.addLayer(tileLayer);
    		
    		//设置地图中心点
    		point = (Point) GeometryEngine.project(new Point(40.805, 111.661),SpatialReference.create(4326),map.getSpatialReference());
    		map.centerAt(point, true);
    		/*
    		zoomin=(Button)findViewById(R.id.zoomin);
    		zoomout=(Button)findViewById(R.id.zoomout);
    		zoomin.setOnClickListener(new OnClickListener(){
    			@Override
    			public void onClick(View arg0) {
    				// TODO Auto-generated method stub
    				map.zoomin();
    			}			
    		});
    		zoomout.setOnClickListener(new OnClickListener(){
    			@Override
    			public void onClick(View arg0) {
    				// TODO Auto-generated method stub
    				map.zoomout();
    			}			
    		});*/
    		//放大与缩小——自定义
    		mZoomControlView = (ZoomControlView) findViewById(R.id.ZoomControlView);
    		mZoomControlView.setMapView(map);
    		
    		//放大与缩小ZoomControls
    		zoomctrl=(ZoomControls)findViewById(R.id.zoomCtrl);
    		zoomctrl.setOnZoomInClickListener(new OnClickListener(){
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				map.zoomin();
    			}			
    		});
    		zoomctrl.setOnZoomOutClickListener(new OnClickListener(){
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    				map.zoomout();
    			}			
    		});
    		
    		gLayerPos = new GraphicsLayer();
    	    map.addLayer(gLayerPos);	    
    	   
    	    locationSymbol =  new PictureMarkerSymbol(this.getResources().getDrawable(
    				R.drawable.location));
    	    
    	    //要定位在地图中的位置,需要知道当前位置,而当前位置有Location对象决定,
    	  	//但是,Location对象又需要LocationManager对象来创建。
    	    //创建LocationManager的唯一方法
    	  	locMag = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    	  	//获得Provider列表
    	  	final List<String> providers=locMag.getProviders(true);
    	  	//循环Provider,根据Provider获取位置信息
    	  	for(String provider:providers)
    	  	{
    		    loc = locMag.getLastKnownLocation(provider);
    		  	
    		    LocationListener locationListener = new LocationListener(){
    		    	/**
    		    	 * 位置改变时调用
    		    	 */
    		    	public void onLocationChanged(Location location) {
    					//刷新图层
    					markLocation(location);
    				}
    		    	//Provider失效时调用
    				public void onProviderDisabled(String arg0) 
    				{
    				}
    				//Provider生效时调用
    				public void onProviderEnabled(String arg0) 
    				{
    				}
    				//状态改变时调用
    				public void onStatusChanged(String arg0, int arg1, Bundle arg2) 
    				{
    				}
    			};		
    			locMag.requestLocationUpdates(provider, 100, 0, locationListener);
    			if(loc!=null)
    			{
    				//开始画图
    				markLocation(loc);
    			}
    		}
    	}
    	
    	private void markLocation(Location location)
    	{		
    		gLayerPos.removeAll();
    		double locx = location.getLongitude();
    		double locy = location.getLatitude();
    		wgspoint = new Point(locx, locy);  
    		mapPoint = (Point) GeometryEngine.project(wgspoint,SpatialReference.create(4326),map.getSpatialReference());
    	
    		//图层的创建
    		Graphic graphic = new Graphic(mapPoint,locationSymbol);
    		gLayerPos.addGraphic(graphic);	
    		map.centerAt(mapPoint, true);
    	}
    
    	@Override
    	protected void onPause() {
    		super.onPause();
    		map.pause();
    	}
    
    	@Override
    	protected void onResume() {
    		super.onResume(); 
    		map.unpause();
    	}
    }


    附件:

    点此下载源码     点此现在类库包


  • 相关阅读:
    循环神经网络(LSTM和GRU)(1)
    threading包的例子和queue包的例子
    xgboost调参
    理解 Python 中的 *args 和 **kwargs
    TFRecords文件的生成和读取(1)
    tensorflow函数介绍(4)
    python其他篇(1)
    python实现Restful服务(基于flask)(2)
    开源多线程性能测试工具-sysbench
    MySQL 8.0.0 版本发布,亮点都在这了!
  • 原文地址:https://www.cnblogs.com/lzugis/p/6539925.html
Copyright © 2011-2022 走看看