正在从 osmbuildings.org 数据站点检索 JSON 数据

Retrieving JSON data from the osmbuildings.org data site

我正在尝试从 osmbuildings.org

检索建筑数据

osmbuildings 文档 (https://osmbuildings.org/documentation/data/) features an example URL (https://data.osmbuildings.org/0.2/anonymous/tile/15/17605/10743.json) returns JSON 位于柏林大约 52°32'30.6"N 13°25'23.2" 处的建筑物的文件E坐标.

我可以使用同一站点获取不同位置建筑物的 JSON 文件吗?例如,我认为使用 XYZ 瓦片坐标的 X、Y 坐标对于新加坡的某个位置来说是 25835 和 5221,缩放比例为 15,相应的 url 将是 https://data.osmbuildings.org/0.2/anonymous/tile/15/25835/5221.json。 但是,当我将它放入 Web 浏览器时,我没有像在柏林案例中那样获得 json 文件。有人可以解释一下吗?

我还在同一位置尝试了不同的缩放值: https://data.osmbuildings.org/0.2/anonymous/tile/16/51672/8779.json

并且位置略有不同,建筑物较少: https://data.osmbuildings.org/0.2/anonymous/tile/16/51666/9459.json

如果您没有收到 JSON 文件,您可能收到空回复。这可能是因为您指定的图块不包含任何建筑数据。

这可能有多种原因,例如有些地区没有可用的建筑数据。但是,在您的情况下,在我看来,您转换为 X、Y 坐标对于新加坡来说是不正确的。

在下面的示例中,我使用了新加坡滨海湾 (https://www.openstreetmap.org/#map=15/1.2742/103.8617) 的坐标。

我使用 OSM wiki (https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames) 中的公式将 lon/lat 转换为图块编号。在伪代码中:

n = 2 ^ zoom
xtile = n * ((lon_deg + 180) / 360)
ytile = n * (1 - (ln(tan(lat_rad) + sec(lat_rad)) / π)) / 2
      = n * (1 - (ln(tan(lat_rad) + (1 / cos(lat_rad))) / π)) / 2

填写相应的lon = 103.8617lat = 1.2742zoom = 15,你得到:

n     = 2^15 
      = 32768

xtile = 32768 * ((103.8617 + 180) / 360)
      = 25837.722737778

ytile = 32768 * (1 - (ln(tan(1.2742) + (1 / cos(1.2742))) / π)) / 2
      = 16268.009923134

忽略小数,我们得到 X = 25837Y = 16268。把它变成link(根据https://osmbuildings.org/documentation/data/),我们得到

https://data.osmbuildings.org/0.2/anonymous/tile/15/25837/16268.json

其中 return JSON 大约 40 座建筑物的数据。

这对我在其他缩放级别上也很有效。例如。放大著名的“滨海湾金沙”(https://www.openstreetmap.org/#map=17/1.28338/103.86148)并根据上面的pseudo-code计算link,我得到:

https://data.osmbuildings.org/0.2/anonymous/tile/17/103350.810851556/65068.69652388.json

其中 return 一个 JSON 包含命名建筑物,例如“Marina Bay Sands Tower 1”、“Marina Bay Sands Tower 2",等等,这表明它按预期工作。