图纸地图应用程序坐标WGS84

时间:2014-03-30 10:52:08

标签: c# graphics maps

如何处理大的WGS84点坐标?

我认为,我能做的是将世界(WGS84)点转换为屏幕上的点数(以像素为单位)。这是一个好方法吗?它仍然不能正常工作,因为需要大变焦,我必须将单位从米改为毫米(但是如何?只是乘以x和y的点?)。

1 个答案:

答案 0 :(得分:0)

对于此映射问题,这是一种非常简单的方法。地理学家可能会为此哭泣,但只要坐标低于约70°纬度并且窗户的大小不是太大,它在实践中效果很好。此外,不要尝试仅使用它们的起点和终点直接映射大对象(例如很长的行)。

public PointF GeoCoordToPixel(IGeographicPosition geoPos)
{
    double tempLong = geoPos.Longitude;
    if (tempLong > CenterPos.Longitude && (tempLong - CenterPos.Longitude) > 180)
    {
        // the position is to the left, over the antimeridian
        tempLong = tempLong - 360;
    }

    if (tempLong < CenterPos.Longitude && (CenterPos.Longitude - tempLong) > 180)
    {
        // the position is to the right, over the antimeridian
        tempLong = tempLong + 360;
    }

    PointF pt = new PointF(
        (float)((tempLong - LongitudeOfOrigin) / LongitudeIncrement),
        (float)((-geoPos.Latitude + LatitudeOfOrigin) / LatitudeIncrement));

    return pt;
}

使用CenterPos =窗口中心; LatituteOfOrigin / LongitudeOfOrigin =窗口的左上角; LongitudeIncrement / LatitudeIncrement =视图比例。他们的关系是:

LatitudeOfOrigin = CenterPos.Latitude + (m_drawingBuffer.Height / 2.0 * LatitudeIncrement);
LongitudeOfOrigin = CenterPos.Longitude - (m_drawingBuffer.Width / 2.0 * LongitudeIncrement);

和逆:

public CGeographicPosition PixelToGeoCoord(PointF pt)
{
     double latitude = -(pt.Y * LatitudeIncrement) + LatitudeOfOrigin;
     double longitude = (pt.X * LongitudeIncrement) + LongitudeOfOrigin;
     if (longitude > 180)
     {
         longitude -= 360;
     }

     return (new CGeographicPosition(latitude, longitude, 0));
}

不是很难,是吗?