可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am having trouble in converting the latitude and longitude values into android esri arcGIS map Point. Here's my code to get latitude and longitude values from GPS coordinates:
LocationManager lm; String towers; double lat; double longi; TextView txt; lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria crit = new Criteria(); towers = lm.getBestProvider(crit, false); Location location = lm.getLastKnownLocation(towers); if(location != null) { lat = location.getLatitude(); longi = location.getLongitude(); }
now I have the latitude and longitude values. Now all I need is to convert these values into valid esri arcGIS MapPoint. Can anyone help me?
Thanks in advance.
回答1:
Assuming you're using the ESRI Android API? If so, create a graphics layer on your map. Then create a point object
com.esri.core.geometry.Point Point myPoint = new Point();
then set the x/y values:
myPoint.setX(longi); myPoint.setY(lat);
then add myPoint to the graphics object.
http://help.arcgis.com/en/arcgismobile/10.0/apis/android/api/index.html
回答2:
Yes, it is possible. But you don't use the locationmanager in ArcGis.
ArcGIS has the predefined method like LocationListener, that is: OnStatusChangedListener.
See the below code for converting location latitude and longitude into esri arcGIS MapPoint.
mMapView.setOnStatusChangedListener(new OnStatusChangedListener() { /** * */ private static final long serialVersionUID = 1L; public void onStatusChanged(Object source, STATUS status) { if (source == mMapView && status == STATUS.INITIALIZED) { LocationService ls = mMapView.getLocationService(); ls.setAutoPan(false); ls.setLocationListener(new LocationListener() { boolean locationChanged = false; // Zooms to the current location when first GPS fix // arrives. public void onLocationChanged(Location loc) { if (!locationChanged) { locationChanged = true; double locy = loc.getLatitude(); double locx = loc.getLongitude(); Point wgspoint = new Point(locx, locy); Point mapPoint = (Point) GeometryEngine.project(wgspoint, SpatialReference.create(4326), mMapView.getSpatialReference()); Unit mapUnit = mMapView.getSpatialReference().getUnit(); double zoomWidth = Unit.convertUnits( SEARCH_RADIUS, Unit.create(LinearUnit.Code.MILE_US), mapUnit); Envelope zoomExtent = new Envelope(mapPoint, zoomWidth, zoomWidth); mMapView.setExtent(zoomExtent); GraphicsLayer gLayer = new GraphicsLayer(); PictureMarkerSymbol symbol = new PictureMarkerSymbol(getResources().getDrawable(R.drawable.twiz_car_red)); Graphic graphic = new Graphic(mapPoint, symbol); //Graphic point=new Graphic(new Point(x, y),new SimpleMarkerSymbol(Color.CYAN,20,STYLE.CIRCLE)); gLayer.addGraphic(graphic); mMapView .addLayer(gLayer); } } public void onProviderDisabled(String arg0) { } public void onProviderEnabled(String arg0) { } public void onStatusChanged(String arg0, int arg1, Bundle arg2) { } }); ls.start(); } } });
回答3:
I've borrowed some code from here
private Point ToGeographic(Point pnt) { double mercatorX_lon = pnt.getX(); double mercatorY_lat = pnt.getY(); if (Math.abs(mercatorX_lon) < 180 && Math.abs(mercatorY_lat) < 90) return pnt; if ((Math.abs(mercatorX_lon) > 20037508.3427892) || (Math.abs(mercatorY_lat) > 20037508.3427892)) return pnt; double x = mercatorX_lon; double y = mercatorY_lat; double num3 = x / 6378137.0; double num4 = num3 * 57.295779513082323; double num5 = Math.floor((double)((num4 + 180.0) / 360.0)); double num6 = num4 - (num5 * 360.0); double num7 = 1.5707963267948966 - (2.0 * Math.atan(Math.exp((-1.0 * y) / 6378137.0))); mercatorX_lon = num6; mercatorY_lat = num7 * 57.295779513082323; return new Point(mercatorX_lon, mercatorY_lat); } private Point ToWebMercator(Point pnt) { double mercatorX_lon = pnt.getX(); double mercatorY_lat = pnt.getY(); if ((Math.abs(mercatorX_lon) > 180 || Math.abs(mercatorY_lat) > 90)) return pnt; double num = mercatorX_lon * 0.017453292519943295; double x = 6378137.0 * num; double a = mercatorY_lat * 0.017453292519943295; mercatorX_lon = x; mercatorY_lat = 3189068.5 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a))); return new Point(mercatorX_lon, mercatorY_lat); }
I make no claims of efficiency, but it's a starting point at least.
回答4:
Disclaimer: I'm not an expert in this, but want to try to help. :)
There is now an ArcGIS Stack Exchange site. There's more information being added all the time and is a nice consolidated resource compared to what is out there disbursed on the interwebs.
For frameworks, I recommend GeoTools for Android.
As an aside, QGIS for Android is an interesting project from Marco Bernasocchi which you may find helpful as a reference.
Hope you can find what you're looking for!
回答5:
i made a function that converts the two parameters of a location point to arcgis point :
private Point ConvertMyLocationPoint(final double x, final double y) { Point wgspoint = new Point(x, y); Point mapPoint = (Point) GeometryEngine.project(wgspoint, SpatialReference.create(4326), mMapView.getSpatialReference()); return mapPoint; }
回答6:
//convert longitude and latitude to map point X Y
- (AGSPoint *)agsPointFromLatitude:(double)latitude longitude:(double)longitude { double mercatorX = longitude * 0.017453292519943295 * 6378137.0; double a = latitude * 0.017453292519943295; double mercatorY = 3189068.5 * log((1.0 + sin(a))/(1.0 - sin(a))); AGSPoint *obj = [AGSPoint pointWithX:mercatorX y:mercatorY spatialReference: [AGSSpatialReference wgs84SpatialReference]]; return obj; }