arcgis android开发之添加地图控件并缩放至当前位置

添加地图控件,在布局文件中是这样写的

<com.esri.android.map.MapView
        android:layout_width="match_parent"
        android:layout_weight="4"
        android:layout_height="0dp"
        android:id="@+id/mapview">
    </com.esri.android.map.MapView>

主要是前面的com.esri.android.map.MapView,添加的是一个MapView控件,

接着在java代码中新建一个MapView,还是通过fingViewById的方法建立连接,

MapView map;
map = (MapView)findViewById(R.id.mapview);
然后添加一个图层,ArcGISTiledMapServiceLayer,

有好几种图层,具体的不同见以下网址:

https://developers.arcgis.com/javascript/3/jsapi/arcgisdynamicmapservicelayer-amd.html

用addLayer方法添加图层,当然,可以添加很多个图层

String strMapUrl = "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer";
map.addLayer(new ArcGISTiledMapServiceLayer(strMapUrl));


或者两个合一起写也行。这个地图是中文的。

英文的url:"http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"

然后是缩放至当前位置,首先需要get当前位置的经纬度

无论是使用GPS还是Network都是可以的,获得了Location之后获取经纬度:

longitude = loc.getLongitude();
latitude = loc.getLatitude();
接着新建Point,传入经纬度参数,再将该Point转换成你添加的地图的投影坐标系上的点
Point wgspoint = new Point(longi, lati);
Point mapPoint = (Point) GeometryEngine.project(wgspoint, SpatialReference.create(4326), map.getSpatialReference());

上段代码第二行,用project方法转换点时第一个参数是待转换的点,第二个参数是输入的投影坐标,第三个参数是输出投影坐标
4326是GCS_WGS_1984 的wkid,具体的各个wkid可以看这个网址(http://www.cnblogs.com/liweis/p/5951032.html),下面有个附表,有大部分的投影坐标系的wkid

用下面的代码缩放至当前位置一定范围的地图:

Unit mapUnit = map.getSpatialReference().getUnit();
double zoomWidth = Unit.convertUnits(3,
                                     Unit.create(LinearUnit.Code.MILE_US),
                                     mapUnit);
Envelope zoomExtent = new Envelope(mapPoint, zoomWidth, zoomWidth);
map.setExtent(zoomExtent);

如果不需要随时变动的话以上代码就可以结束了,但是现实中人拿着手机可能是不断运动的,,特别是开着车子跑的
这就需要地图随定位不断切换了

我们可以将上面缩放的那段代码放到定位中,位置变换的时候执行它

like this:

map.setOnStatusChangedListener(new OnStatusChangedListener() {
   private static final long serialVersionUID = 1L;
   public void onStatusChanged(Object source, STATUS status) {
    if (source == map && status == STATUS.INITIALIZED) {
     
     LocationDisplayManager locationManager=map.getLocationDisplayManager();
     locationManager.setAutoPanMode(AutoPanMode.OFF);
     locationManager.setLocationListener(new LocationListener() {
      
      boolean locationChanged = false;
      
      public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
       // TODO Auto-generated method stub
       
      }
      
      public void onProviderEnabled(String arg0) {
       // TODO Auto-generated method stub
       
      }
      
      public void onProviderDisabled(String arg0) {
       // TODO Auto-generated method stub
       
      }
      
      public void onLocationChanged(Location loc) {
       if (!locationChanged) {
        locationChanged = true;
        double lati = loc.getLatitude();
        double longi = loc.getLongitude();
        longitude = loc.getLongitude();
        latitude = loc.getLatitude();
        Point wgspoint = new Point(longi, lati);
        Point mapPoint = (Point) GeometryEngine
          .project(wgspoint,
            SpatialReference.create(4326),
            map.getSpatialReference());
        Unit mapUnit = map.getSpatialReference()
          .getUnit();
        double zoomWidth = Unit.convertUnits(
          SEARCH_RADIUS,
          Unit.create(LinearUnit.Code.MILE_US),
          mapUnit);
        Envelope zoomExtent = new Envelope(mapPoint,
          zoomWidth/3, zoomWidth/3);
        map.setExtent(zoomExtent);
       
       }
      }
     });
     locationManager.start();
    }
   }
  });

就酱





猜你喜欢

转载自blog.csdn.net/qq_34215717/article/details/77175668