我希望动态生成Google地图叠加层,其中包含一个透明的GIF / PNG图像,在不同位置有多个点。
会有大量的点,如果我使用普通标记,性能将是不可接受的。
我遇到了SharpMap库,它看起来像是一个用于处理地图的优秀,全面的库。
问题是,它也很大,我不知道从哪里开始。
对于初学者,我认为我不需要使用整个框架,甚至可能不需要实例化“Map”对象。
我需要做的就是将纬度/经度坐标的集合转换为像素坐标的集合,给定当前缩放级别和视口的大小(固定)。
任何有SharpMap经验的人都可以指出我可以/应该使用哪些类/命名空间来完成这项工作吗?
发现了与此有些相关的文章,但应用于Google地球而不是Maps API。
尝试让样本正常工作。
答案 0 :(得分:2)
我使用以下类将lat / long转换为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);
}
}