Преобразование широты и долготы в esri arcGIS MapPoint - PullRequest
6 голосов
/ 10 января 2012

У меня возникли проблемы с преобразованием значений широты и долготы в android esri arcGIS map Point. Вот мой код для получения значений широты и долготы из 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. Кто-нибудь может мне помочь?

Заранее спасибо.

Ответы [ 6 ]

6 голосов
/ 31 октября 2012

Да, это возможно.Но вы не используете locationmanager в 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();

     }
   }
});
6 голосов
/ 20 января 2012

Предполагается, что вы используете 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

5 голосов
/ 13 августа 2013

Я позаимствовал некоторый код из здесь

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 голосов
/ 13 января 2015

я сделал функцию, которая преобразует два параметра точки местоположения в точку Арджиса:

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;    
    }
4 голосов
/ 10 января 2012

Отказ от ответственности: Я не эксперт в этом, но хочу попытаться помочь. :)

Теперь существует сайт ArcGIS Stack Exchange . Все время добавляется больше информации, и это хороший консолидированный ресурс по сравнению с тем, что распределяется по сетям.

Для фреймворков я рекомендую GeoTools для Android.

Кроме того, QGIS для Android - это интересный проект от Marco Bernasocchi, который вы можете найти полезным для справки.

Надеюсь, вы найдете то, что ищете!

0 голосов
/ 27 сентября 2014

// преобразование долготы и широты в точку карты 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;
  }
...