2012-01-10 233 views
6

我在将纬度和经度值转换为android esri arcGIS map Point时遇到了问题。这里是我的代码从GPS坐标获取纬度和经度值:将经度和纬度转换为esri arcGIS MapPoint

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(); 
      } 

现在我有经度和纬度值。现在我需要的是将这些值转换为有效的esri arcGIS MapPoint。谁能帮我?

在此先感谢。

回答

4

声明:我不是这方面的专家,但想尝试帮助。 :)

现在有一个ArcGIS Stack Exchange网站。有更多的信息随时添加,与网站上发布的内容相比,它是一个不错的统一资源。

对于框架,我建议Android的GeoTools

顺便说一句,QGIS for Android是Marco Bernasocchi的一个有趣的项目,您可能会发现它有帮助作为参考。

希望你能找到你要找的东西!

6

是的,这是可能的。但是您不使用ArcGis中的位置管理器。

ArcGIS具有像LocationListener这样的预定义方法,即:OnStatusChangedListener。

请参阅下面的代码将位置纬度和经度转换为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(); 

    } 
    } 
}); 
5

我已经借了一些代码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); 
} 

我毫无效率的要求,但它至少是一个起点。

+0

真的sooooooooooooooooooooo真棒 – ROR 2014-06-30 22:01:17

0

//转换经度和纬度的地图点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; 
    } 
4

我做了一个定位点的两个参数转换到ArcGIS点功能:

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;  
    }