2012-01-10 235 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;  
    }