Java 从谷歌静态地图获取像素坐标

Java 从谷歌静态地图获取像素坐标,java,android,google-maps,mercator,Java,Android,Google Maps,Mercator,我想找出静态地图上lat/lng的像素坐标。例如,我从以下网站下载了一幅图像: 我想要的是从一个lat/lng long能够映射到像素坐标。我搜索了一下,发现墨卡托投影可以解决我的问题。然而,我找不到任何合适的方法来做这件事。谁能帮帮我吗。另外,我已经放大到9,如URL所示,如果您想直接在地图的位图上绘制,将谷歌静态地图的Lat/Lon转换为像素非常有用。这是一种比用URL传递数百个参数更好的方法。我也遇到了同样的问题,在网上找到了四种看起来非常相似但用其他语言编写的解决方案。我把它翻译成C。

我想找出静态地图上lat/lng的像素坐标。例如,我从以下网站下载了一幅图像:


我想要的是从一个lat/lng long能够映射到像素坐标。我搜索了一下,发现墨卡托投影可以解决我的问题。然而,我找不到任何合适的方法来做这件事。谁能帮帮我吗。另外,我已经放大到9,如
URL

所示,如果您想直接在地图的位图上绘制,将谷歌静态地图的Lat/Lon转换为像素非常有用。这是一种比用URL传递数百个参数更好的方法。我也遇到了同样的问题,在网上找到了四种看起来非常相似但用其他语言编写的解决方案。我把它翻译成C。我相信在Java或C中也可以很容易地使用这个简单的代码:

//(half of the earth circumference's in pixels at zoom level 21)
static double offset = 268435456; 
static double radius = offset / Math.PI;
// X,Y ... location in degrees
// xcenter,ycenter ... center of the map in degrees (same value as in 
// the google static maps URL)
// zoomlevel (same value as in the google static maps URL)
// xr, yr and the returned Point ... position of X,Y in pixels relativ 
// to the center of the bitmap
static Point Adjust(double X, double Y, double xcenter, double ycenter, 
                    int zoomlevel)
{
    int xr = (LToX(X) - LToX(xcenter)) >> (21 - zoomlevel);
    int yr = (LToY(Y) - LToY(ycenter)) >> (21 - zoomlevel);
    Point p = new Point(xr, yr);
    return p;
}

static int LToX(double x)
{
    return (int)(Math.Round(offset + radius * x * Math.PI / 180));
}

static int LToY(double y)
{
    return (int)(Math.Round(offset - radius * Math.Log((1 + 
                 Math.Sin(y * Math.PI / 180)) / (1 - Math.Sin(y * 
                 Math.PI / 180))) / 2));
}
用法:

  • 调用此函数以获取X和Y像素坐标
  • 结果参照位图的中心,因此添加 将宽度/2和高度/2位图映射到x和y值。这给了你 绝对像素位置
  • 检查像素位置是否在位图内
  • 你想画什么就画什么

  • 由于谷歌的墨卡托投影(Mercator projection)的变体,它不能在靠近两极的地方工作,但对于通常的坐标,它工作得非常好。

    harry4616的python代码:


    通过像素坐标。你是说屏幕上的X,Y位置与地图有关吗?不,图像中的像素位置与屏幕上图像的位置无关
    import math
    OFFSET = 268435456 # half of the earth circumference's in pixels at zoom level 21
    RADIUS = OFFSET / math.pi
    
    def get_pixel(x, y, x_center, y_center, zoom_level):
        """
        x, y - location in degrees
        x_center, y_center - center of the map in degrees (same value as in the google static maps URL)
        zoom_level - same value as in the google static maps URL
        x_ret, y_ret - position of x, y in pixels relative to the center of the bitmap
        """
        x_ret = (l_to_x(x) - l_to_x(x_center)) >> (21 - zoom_level)
        y_ret = (l_to_y(y) - l_to_y(y_center)) >> (21 - zoom_level)
        return x_ret, y_ret
    
    def l_to_x(x):
        return int(round(OFFSET + RADIUS * x * math.pi / 180))
    
    def l_to_y(y):
        return int(round(OFFSET - RADIUS * math.log((1 + math.sin(y * math.pi / 180)) / (1 - math.sin(y * math.pi / 180))) / 2))