2009-10-21 74 views
2

我希望動態生成Google地圖覆蓋圖,該覆蓋圖將由包含多個點的單個透明GIF/PNG圖像組成。使用SharpMap庫生成Google地圖覆蓋圖

會有大量的點,如果我使用正常的標記,性能將是不可接受的。

我遇到了SharpMap庫,它看起來像一個優秀的綜合圖書館,用於處理地圖。

問題是,它也很大,我不確定從哪裏開始。

對於初學者,我不認爲我需要使用整個框架,我可能甚至不需要實例化一個'Map'對象。

在我給出當前縮放級別和視口大小(固定)的情況下,我需要將所有經緯度座標轉換爲像素座標的集合。

任何有過使用SharpMap經驗的人都可以指出我可以/應該使用哪些類/名稱空間來完成此任務?


發現了一篇與此有點相關的文章,但適用於Google地球而不是Maps API。

http://web.archive.org/web/20080113140326/http://www.sharpgis.net/PermaLink,guid,f5bf2808-4cda-4f41-9ae5-98109efeb8b0.aspx

試圖讓樣本工作。

回答

2

我用下面的類從緯度/長x/y的轉換:

public static class StaticMapHelper 
{ 
    private const long offset = 268435456; 
    private const double radius = offset/Math.PI; 

    private static double LongitudeToX(double longitude) 
    { 
     return Math.Round(offset + radius * longitude * Math.PI/180); 
    } 

    private static double LatitudeToY(double latitude) 
    { 
     return Math.Round(offset - radius * Math.Log((1 + Math.Sin(latitude * Math.PI/180))/(1 - Math.Sin(latitude * Math.PI/180)))/2); 
    } 

    private static double XToLongitude(double x) 
    { 
     return ((Math.Round(x) - offset)/radius) * 180/Math.PI; 
    } 

    private static double YToLatitude(double y) 
    { 
     return (Math.PI/2 - 2 * Math.Atan(Math.Exp((Math.Round(y) - offset)/radius))) * 180/Math.PI; 
    } 

    public static GeoPoint XYToLongitudeLatitude(int offsetX, int offsetY, double centerLongitude, double centerLatitude, int googleZoom) 
    { 
     double zoom_factor = Math.Pow(2, 21 - googleZoom); 
     double longitude = XToLongitude(LongitudeToX(centerLongitude) + (offsetX * zoom_factor)); 
     double latitude = YToLatitude(LatitudeToY(centerLatitude) + (offsetY * zoom_factor)); 
     return new GeoPoint(longitude, latitude); 
    } 

    public static GeoPoint LongitudeLatitudeToXY(int offsetX, int offsetY, double centerLongitude, double centerLatitude, int googleZoom) 
    { 
     double zoom_factor = Math.Pow(2, 21 - googleZoom); 
     double x = (LongitudeToX(offsetX) - LongitudeToX(centerLongitude))/zoom_factor; 
     double y = (LatitudeToY(offsetY) - LatitudeToY(centerLatitude))/zoom_factor; 
     return new GeoPoint(x, y); 
    } 

}