setting to the same ViewPoint yields different result

242
0
05-23-2022 11:12 PM
ofirrosner
New Contributor III

I'm trying to implement some zoom-in-zoom out feature in my program, for this I'm using two ViewPoints with Wgs84 projection, one is default and other one is current, when I return to the default one it seems to "drift" by ~ 0.1 degrees(P.s the logic working as intended)

so on the first time _currentViewPoint ,XMin for example, is 4.77075... which is exactly as _defaultViewPoint XMin

but on the second time(after some panning and zooming the else condition is met and returning to _defaultViewPoint) the _currentViewPoint XMin is 4.62159...

why this so called drift happens?

 

 

 

public void Click()
{
    if(_firstClick)
    {
        _firstClick = false;
        _mapService = GetMapService();
        _defaultViewPoint = _mapService.IntialViewPoint;
    }
    
    _currentViewPoint = _mapService.GetViewPoint();
    if(ArePointsEqual(_defaultViewPoint,_currentViewPoint)
    {
        if(_viewPointToZoom != null)
        {
            _mapService.SetViewPointAsync(_viewPointToZoom)
        }
    }
    else
    {
        _viewPointToZoom = _mapService.GetViewPoint();
        _mainMapService.SetViewPointAsync(_defaultViewPoint);
    }
}

public ViewPoint GetViewPoint()
{
    ViewPoint current = null;
    try
    {
        current = EsriGeoView.GetCurrentViewPoint(ViewpointType.BoundingGeomerty);
        return ProjectToWgs84(current.TargetGeometry);
    }
    catch(...)
    {
        //catch
    }
    return current;
}

private ViewPoint ProjectToWgs94(Geometry targetGeometry)
{
    try
    {       
        var geometry = GeometryEngine.Project(targetGeometry, SpatialReefernces.Wgs84);
        return new ViewPoint(geometry);
    }
    catch(...)
    {
        //catch
    }
    
}

private async Task SetViewPointAsync(ViewPoint viewpoint)
{
    //some non relevent code
    await EsriGeoView.SetViewPointAsync(viewpoint);
}


private bool AreViewPointsEqual(Viewpoint vp1, Viewpoint vp2, double tolerance = 1e-4)
{

    Envelope r1 = vp1.TargetGeometry.Extent,  r2 = vp2.TargetGeometry.Extent;
    var x1 = (r1.XMax + r1.XMin) / 2;
    var x2 = (r1.YMax + r1.YMin) / 2;
    var y1 = (r2.XMax + r2.XMin) / 2;
    var y2 = (r2.YMax + r2.YMin) / 2;

    return Math.abs(x1-x2) < tolerance && Math.abs(y1-y2) < tolerance);

} 

 

 

Tags (1)
0 Kudos
0 Replies