欢迎大家增加Arcgis API for Android的QQ交流群:337469080
先说说写这篇文章的原因吧,在群内讨论的过程中,有人提到了定位的问题,刚好,自己曾经在做相关工作的时候做过相关的东西,所以就总结一下,给大家共享出来,因为本人水平有限,bug是在所难免,还望有更高的高人批评指正。废话不多说,直接进入主题。
要想在地图上定位并将定位结果实时显示出来,启发逻辑上非常easy:首先,接收并解析GPS或者网络的位置信息,一般来说,接受的位置信息是WGS84的经纬度的,可是我们的地图的投影一般都不会是WGS84的,所以,位置信息接收来了得做一次坐标转换,眼下,坐标转换的方式有七參数或者四參数的方式,可是这两种參数转换的算法和方式都不怎么方便,还好,Arcgis支持从WGS84到地图投影的转换,转换完毕之后再在地图上将该点展示出来并间隔刷新就可以实现。以下我来说说我的实现方式:
1、定义一个GraphicsLayer并将之加入到map
GraphicsLayer gLayerGps;
……
gLayerGps = new GraphicsLayer(); mapview.addLayer(gLayerGps);
2、定义一个PictureMarkerSymbol用来设置位置显示的样式
PictureMarkerSymbol locationSymbol;
locationSymbol = new PictureMarkerSymbol(this.getResources().getDrawable( R.drawable.location));
3、定义LocationManager
LocationManager locMag; //要定位在地图中的位置,须要知道当前位置,而当前位置有Location对象决定, //可是,Location对象又须要LocationManager对象来创建。 //创建LocationManager的唯一方法 locMag = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); //获得Provider列表 final List<String> providers=locMag.getProviders(true);
4、循环Provider,依据Provider获取位置信息
//循环Provider,依据Provider获取位置信息 for(String provider:providers) { loc = locMag.getLastKnownLocation(provider); LocationListener locationListener = new LocationListener(){ /** * 位置改变时调用 */ public void onLocationChanged(Location location) { lblPosition.setText("Lat:"+String.format("%.4f", location.getLatitude()) + ",Lon:" + String.format("%.4f", location.getLongitude())); //刷新图层 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) { double latitude = loc.getLatitude(); double longitude = loc.getLongitude(); lblPosition.setText("Lat:"+String.format("%.4f", latitude) + ",Lon:" + String.format("%.4f", longitude)); //開始绘图 markLocation(loc); } }
5、当位置不为空时,就在地图上画点
/** * 在地图上显示当前位置 * @param location */ 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),mapview.getSpatialReference()); //图层的创建 Graphic graphicPoint = new Graphic(mapPoint,locationSymbol); gLayerPos.addGraphic(graphicPoint); /*划线 if (startPoint == null) { poly=new Polyline(); startPoint = mapPoint; poly.startPath((float) startPoint.getX(), (float) startPoint.getY()); Graphic graphicLine = new Graphic(startPoint,new SimpleLineSymbol(Color.RED,2)); gLayerGps.addGraphic(graphicLine); }*/ poly.lineTo((float) mapPoint.getX(), (float) mapPoint.getY()); gLayerGps.addGraphic(new Graphic(poly,new SimpleLineSymbol(Color.BLACK,2))); }
6、将gLayerPos显示
gLayerPos.setVisible(false);
这样,GPS的点就能在地图上显示了,而且可以显示所走的路径……
Arcgis API for Android之GPS定位,布布扣,bubuko.com
时间: 2024-12-10 16:58:21