【问题标题】:Convert latitude and longitude into esri arcGIS MapPoint将经纬度转换为 esri arcGIS MapPoint
【发布时间】:2012-02-06 21:23:30
【问题描述】:

我在将纬度和经度值转换为 android esri arcGIS 地图点时遇到问题。这是我从 GPS 坐标中获取纬度和经度值的代码:

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。谁能帮帮我?

提前致谢。

【问题讨论】:

    标签: android gps arcgis esri


    【解决方案1】:

    假设您使用的是 ESRI Android API?如果是这样,请在地图上创建一个图形图层。然后创建一个点对象

    com.esri.core.geometry.Point
    Point myPoint = new Point();
    

    然后设置 x/y 值:

    myPoint.setX(longi);
    myPoint.setY(lat);
    

    然后将 myPoint 添加到图形对象。

    http://help.arcgis.com/en/arcgismobile/10.0/apis/android/api/index.html

    【讨论】:

      【解决方案2】:

      是的,这是可能的。但是你没有在 ArcGis 中使用 locationmanager。

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

      【讨论】:

        【解决方案3】:

        我从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);
        }
        

        我没有声称效率,但这至少是一个起点。

        【讨论】:

        • 真的太棒了
        【解决方案4】:

        免责声明:我不是这方面的专家,但想提供帮助。 :)

        现在有一个ArcGIS Stack Exchange 网站。与互联网上发布的信息相比,一直在添加更多信息,并且是一个很好的综合资源。

        对于框架,我推荐GeoTools for Android。

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

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

        【讨论】:

          【解决方案5】:

          我做了一个函数,将位置点的两个参数转换为 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;    
              }
          

          【讨论】:

            【解决方案6】:

            //将经纬度转换为地图点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;
              }
            

            【讨论】:

              猜你喜欢
              • 2015-02-20
              • 1970-01-01
              • 2013-06-23
              • 2012-06-10
              • 2015-09-08
              • 1970-01-01
              • 2014-11-24
              • 2010-11-22
              • 1970-01-01
              相关资源
              最近更新 更多