将谷歌静态图像中的像素转换为 LatLng 坐标

2023-11-21

我正在加载图像谷歌静态地图API,加载的卫星图像是一个宽和长数百米的地方。

https://maps.googleapis.com/maps/api/staticmap?center=53.4055429,-2.9976502&zoom=16&size=400x400&maptype=satellite&key=YOUR_API_KEY

另外,图像分辨率显示为10米,如下图

enter image description here.

enter image description here

我的问题是

据我所知,居中地理位置(53.4055429,-2.9976502)以及这个静态图像的分辨率,我如何能够扩展它来计算图像中左上或右下的地理位置,并最终计算图像的每个像素


是什么样的解决方案

看起来你不需要 javascript 解决方案,但 python 不是在浏览器中而是在服务器上使用它。我已经创建了一个 python 示例,但我要坚持的是数学,数学就是计算坐标所需的全部。让我也用 js 来做,让代码片段在浏览器中工作。您可以看到,python 和 js 给出了相同的结果。

跳转到答案

如果您只需要每像素度数的公式,就在这里。它们很简单,你不需要任何外部库,只需要一个 python 的math。可以进一步找到解释。

#!/usr/bin/python
import math

w = 400
h = 400
zoom = 16
lat = 53.4055429
lng = -2.9976502

def getPointLatLng(x, y):
    parallelMultiplier = math.cos(lat * math.pi / 180)
    degreesPerPixelX = 360 / math.pow(2, zoom + 8)
    degreesPerPixelY = 360 / math.pow(2, zoom + 8) * parallelMultiplier
    pointLat = lat - degreesPerPixelY * ( y - h / 2)
    pointLng = lng + degreesPerPixelX * ( x  - w / 2)

    return (pointLat, pointLng)

print 'NE: ', getPointLatLng(w, 0)
print 'SW: ', getPointLatLng(0, h)
print 'NW: ', getPointLatLng(0, 0)
print 'SE: ', getPointLatLng(w, h)

的输出剧本 is

$ python getcoords.py
NE:  (53.40810128625675, -2.9933586655761717)
SW:  (53.40298451374325, -3.001941734423828)
NW:  (53.40810128625675, -3.001941734423828)
SE:  (53.40298451374325, -2.9933586655761717)

我们必须从什么开始

我们在url中需要一些参数https://maps.googleapis.com/maps/api/staticmap?center=53.4055429,-2.9976502&zoom=16&size=400x400&maptype=satellite&key=YOUR_API_KEY– 坐标、缩放、像素大小。

让我们引入一些初始变量:

var config = {
    lat: 53.4055429,
    lng: -2.9976502,
    zoom: 16,
    size: {
        x: 400,
        y: 400,
    }
};

512 像素地球的数学

数学如下。飞涨1代表地球赤道全景360°当使用图像尺寸时512 (有关大小和缩放的信息,请参阅文档)。请参阅缩放 1 时的示例。这是非常重要的一点。比例(每像素的度数)不取决于图像大小。当改变图像尺寸时,人们会看到相同的比例:比较1 and 2– 第二张图片是大图片的裁剪版本。最大图像尺寸为googleapis is 640.

每次放大分辨率提高两倍。因此,图像的经度宽度是

lngDegrees = 360 / 2**(zoom - 1); // full image width in degrees, ** for power

然后使用线性函数找到图像任意点的坐标。应该提到的是,线性度仅适用于高变焦图像,不能将其用于低变焦(如 5 或更低)。低变焦的数学运算稍微复杂一些。

lngDegreesPerPixel = lngDegrees / 512 = 360 / 2**(zoom - 1) / 2**9 = 360 / 2**(zoom + 8); 
lngX = config.lng + lngDegreesPerPixel * ( point.x - config.size.x / 2);

纬度不同

赤道上的纬度和经度大小相同,但如果向北或向南,经度会变小,因为地球上的纬线环的半径较小 -r = R * cos(lat) < R因此图像高度(以度为单位)变得更小(参见 P.S.)。

latDegrees = 360 / 2**(zoom - 1) * cos(lat); // full image height in degrees, ** for power

并分别

latDegreesPerPixel = latDegrees / 512 = 360 / 2**(zoom - 1) * cos(lat) / 2**9 = 360 / 2**(zoom + 8) * cos(lat);
latY = config.lat - latDegreesPerPixel * ( point.y - config.size.y / 2)

之后的标志config.lat与 的符号不同lngX由于地球经度方向与图像一致x方向,但纬度方向相反y图像上的方向。

所以我们现在可以创建一个简单的函数来使用其查找像素的坐标x and y图片上的坐标。

var config = {
    lat: 53.4055429,
    lng: -2.9976502,
    zoom: 16,
    size: {
        x: 400,
        y: 400,
    }
};

function getCoordinates(x, y) {
    var degreesPerPixelX = 360 / Math.pow(2, config.zoom + 8);
    var degreesPerPixelY = 360 / Math.pow(2, config.zoom + 8) * Math.cos(config.lat * Math.PI / 180);

    return {
        lat: config.lat - degreesPerPixelY * ( y - config.size.y / 2),
        lng: config.lng + degreesPerPixelX * ( x  - config.size.x / 2),
    };
}

console.log('SW', getCoordinates(0, config.size.y));
console.log('NE', getCoordinates(config.size.x, 0));
console.log('SE', getCoordinates(config.size.x, config.size.y));
console.log('NW', getCoordinates(0, 0));
console.log('Something at 300,128', getCoordinates(300, 128));

附:你可能会问我,为什么我放置cos(lat)纬度的乘数,而不是作为经度公式的除数。我发现,谷歌选择在不同纬度上每个像素具有恒定的经度比例,所以,cos将纬度作为乘数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将谷歌静态图像中的像素转换为 LatLng 坐标 的相关文章

随机推荐

  • 不可变对象的线程安全性如何?

    大家都说不可变对象是线程安全的 但这是为什么呢 以在多核 CPU 上运行的以下场景为例 核心 1 读取内存位置的对象0x100并且缓存在Core 1的L1 L2缓存中 GC 会在该内存位置收集该对象 因为它已变得符合条件并且0x100变得可
  • 如何知道写时复制页面是否是实际副本?

    当我使用 mmap 创建写时复制映射 MAP PRIVATE 时 一旦我写入特定地址 该映射的某些页面就会被复制 在我的程序中的某个时刻 我想弄清楚哪些页面实际上已被复制 有一个称为 mincore 的调用 但它仅报告页面是否在内存中 这与
  • CreateProcessW 是否已弃用?

    我找不到准确的答案 所以我决定问一下 我一直在阅读 Windows 调试内部 在示例中它告诉我在kernel32 CreateProcessW 但在此之前它使用 symfixdebugger 命令将调试器符号搜索路径设置为指向 Micros
  • SKProductsRequest 未返回任何产品

    这是我第一次尝试 但我遇到了获取产品列表的障碍 我创建了一个临时配置文件 例如 com mycompany myproduct 以及 iTunes connect 上的附加功能 例如 com mycompany myproduct feat
  • 将 XPATH 谓词与位置结合起来

    我有一个具有该类的 div 元素的集合media gallery item 我想选择元素号 x 当只选择所有项目时 我得到 5 个结果 x div id content area div class media gallery item 现
  • Sass (.scss) 文件的 Aptana Studio 3 代码辅助

    我正在使用 Aptana Studio 3 我希望获得适用于 Sass scss 文件的代码辅助功能 如果代码辅助不适用于 Sass 语法 声明 也没关系 但我希望获得标准 CSS 声明的语法突出显示和代码完成帮助 例如 如果我输入 bac
  • 在Python中从IP地址和掩码长度获取IP掩码

    给定一个以点分四元表示法表示的 IP 地址 例如 192 192 45 1掩码长度通常为 8 16 24 但也可以是任何长度 即 17 有人可以提供 python 代码来计算子网掩码吗 最好是我 可以获得 32 位整数的结果 以便很容易进行
  • 如何从现有窗口创建新的 PyQt4 窗口?

    我一直在尝试使用 python3 和 Qt4 从现有窗口调用新窗口 我已经使用 Qt Designer 创建了两个窗口 主应用程序和另一个窗口 并且我已将 Qt Designer 生成的 ui 文件转换为 py 脚本 但我似乎无法从主应用程
  • 使用 document.evaluate 时 XPath 元素/对象未定义

    如何修复常规 JavaScript 代码 使其不会显示 未定义 并显示输入字段的值 jQuery 代码工作正常 并在同一页面上正确显示输入字段值 常规 JavaScript var obj document evaluate html bo
  • 调整浏览器大小时 Modernizr 媒体查询不起作用

    我在 JavaScript 中使用 Modernizr 媒体查询来更改元素边距并添加 小 类 当我调整浏览器大小时 我的 Modernizr 媒体查询不起作用 但当我刷新页面时 它就起作用了 我知道我可以使用 jQuery 解决这个问题 w
  • 创建了可绑定的 WindowsFormsHost,但子更新未反映到控件

    我遇到了一个问题 我想将控件绑定到 windowsFormsHost 控件 但众所周知 Childproperty 不是 DP 所以我创建了一个包装器
  • 我可以设置文本区域的大小调整抓取器的样式吗?

    我的设计师刚刚给我设计了带有样式调整大小抓取器的文本区域 问题是 我可以设计它吗 WebKit提供了伪元素 webkit resizer对于调整大小控件 它会自动添加到右下角textarea元素 可以通过应用隐藏它display none
  • 不需要的属性不断获取 data-val-required 属性

    这是经过验证的模型 MetadataType typeof TagValidation public partial class Tag public class TagValidation Editable false HiddenInp
  • org.apache.http.client.ClientProtocolException

    我制作了一个 Android 应用程序 它使用 X509 证书 位于 res raw mykeystore bks 文件夹中 来签名到在 9006 端口上响应的远程服务器 服务器要求我登录 用户名 密码 当我进行 HTTPGet 时 出现以
  • Chrome 37 计算四舍五入

    div div div div div div outerDiv innerDiv remainderDiv height 100px outerDiv width 55 5px z index 1 background color red
  • 所有依赖项都不是通过“pip download”下载的

    我正在尝试设置一个本地目录 其中包含可以在没有互联网连接的计算机上重复使用的安装包 但我在使用某些包时遇到了问题 我首先下载软件包 pip download r requirements txt d my packages no binar
  • jQuery 添加到 JSP 页面

    我有一段在互联网上找到的 jQuery 代码 我想将其集成到我的 jsp 页面中 我使用 Spring 表单标签 这是 jQuery 代码 function select input var id test id id choices id
  • 在 C 中传递时,“Char”将提升为“int”

    我有个问题 我的程序中有一行 sprintf buff Nieznany znak d char va arg x const char break 为什么编译后出现错误 error c In function error error c
  • 在react-select中的input元素之前添加一个图标

    我试图在反应选择的输入元素前面添加一个图标 我可以在占位符中获取图标 但占位符的问题是 当我从下拉列表中选择一些数据时 占位符图标会被删除 我需要一些帮助来获取 Select 语句前面的图标 这是我到目前为止所取得的成就的代码 import
  • 将谷歌静态图像中的像素转换为 LatLng 坐标

    我正在加载图像谷歌静态地图API 加载的卫星图像是一个宽和长数百米的地方 https maps googleapis com maps api staticmap center 53 4055429 2 9976502 zoom 16 si