пространственная привязка

Я новичок в разработке Windows Phone 7. Я недавно загрузил и опробовал образец карты Arcgis, и он выдает мне эту ошибку после изменения URL-адреса TiledMapserverlayer.

Invalid spatial reference. Spatial reference must match map's spatial reference. Clear the map layers collection prior to changing the spatial reference.

.xaml

            <esri:GraphicsLayer ID="MyGraphicsLayer">
                <esri:GraphicsLayer.Graphics>
                    <esri:Graphic Symbol="{StaticResource RedMarkerSymbol}">
                        <esriGeometry:MapPoint X="11560518.5450925" Y="153495.271364825">


                        </esriGeometry:MapPoint>
                    </esri:Graphic>
                </esri:GraphicsLayer.Graphics>
            </esri:GraphicsLayer>

            <esri:ArcGISTiledMapServiceLayer ID="MyLayer" 
                Url="http://www.onemap.sg/ArcGIS/rest/services/basemap/MapServer" />
        </esri:Map>

.cs

    public partial class Map : PhoneApplicationPage
{
    GeoCoordinateWatcher _watcher;
    Graphic _graphicLocation;
    private static ESRI.ArcGIS.Client.Projection.WebMercator mercator =
      new ESRI.ArcGIS.Client.Projection.WebMercator();
    bool initialLoad = true;

    public Map()
    {
        InitializeComponent();

        _graphicLocation = (MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer).Graphics[0];

        _watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
        _watcher.MovementThreshold = 20;

        _watcher.StatusChanged += watcher_StatusChanged;
        _watcher.PositionChanged += watcher_PositionChanged;

        // Start data acquisition
        _watcher.Start();
    }

    void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
    {
        switch (e.Status)
        {
            case GeoPositionStatus.Disabled:
                // The location service is disabled or unsupported.
                // Alert the user
                StatusTextBlock.Text = "Location is unsupported on this device";
                break;
            case GeoPositionStatus.Initializing:
                // The location service is initializing.
                // Disable the Start Location button
                StatusTextBlock.Text = "Initializing location service";
                break;
            case GeoPositionStatus.NoData:
                // The location service is working, but it cannot get location data
                // Alert the user and enable the Stop Location button
                StatusTextBlock.Text = "Data unavailable";
                break;
            case GeoPositionStatus.Ready:
                // The location service is working and is receiving location data
                // Show the current position and enable the Stop Location button
                StatusTextBlock.Text = "Ready - retrieving data";
                break;
        }
    }

    void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
    {
        _graphicLocation.Geometry = mercator.FromGeographic(new MapPoint(e.Position.Location.Longitude, e.Position.Location.Latitude));

        // Use horizontal accuracy (returned in meters) to zoom to the location
        if (initialLoad)
        {
            Envelope rect = new Envelope(
                (_graphicLocation.Geometry as MapPoint).X - (e.Position.Location.HorizontalAccuracy / 2),
                (_graphicLocation.Geometry as MapPoint).Y - (e.Position.Location.HorizontalAccuracy / 2),
                (_graphicLocation.Geometry as MapPoint).X + (e.Position.Location.HorizontalAccuracy / 2),
                (_graphicLocation.Geometry as MapPoint).Y + (e.Position.Location.HorizontalAccuracy / 2));

            MyMap.ZoomTo(rect.Expand(20));

            initialLoad = false;
        }
        else
        {
            MyMap.PanTo(_graphicLocation.Geometry);
        }
    }

    private void PhoneApplicationPage_Unloaded(object sender, RoutedEventArgs e)
    {
        _watcher.Stop();
    }}

Я пробовал много решений, таких как добавление в wkid, но это не работает. У меня очень долго была эта ошибка. Может кто-нибудь, пожалуйста, помогите! Спасибо


person Zen    schedule 11.03.2013    source источник
comment
графика, которую вы добавляете на карту, должна иметь ту же пространственную привязку, что и карта. Если вы изменили URL-адрес, перешли ли вы на карту с другой пространственной привязкой? Это могло вызвать ошибку. Одно из возможных решений - перепроецировать координаты графики на пространственную привязку карты.   -  person progrmr    schedule 11.03.2013


Ответы (1)


В общем, вам не следует смешивать SpatialReferences. Вызов Map.Pan, Zoom для изменения Extent на непроецированную геометрию с SRef, отличным от SRef карты, приведет к возникновению исключения. При изменении положения GPS вы пытаетесь переместить карту, которая имеет различный SRef, что вызывает исключение. У вас не будет этой проблемы, если вы сначала спроецируете точку GPS. Используйте для этого GeometryService. Кстати, взгляните на API GpsLayer в их наборе инструментов, потому что он может сэкономить огромное количество кода, который вы написали вручную выше. Также установите для него ProjectionService, и все должно работать на вас.

Ваше здоровье :)

person atomaras    schedule 19.03.2013