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

时间:2020-10-25 17:03:17

标签: json gis openstreetmap coordinate-transformation

我正在尝试从osmbuildings.org检索建筑数据

osmbuildings文档(https://osmbuildings.org/documentation/data/)的示例网址(https://data.osmbuildings.org/0.2/anonymous/tile/15/17605/10743.json)返回位于柏林大约52°32'30.6“ N 13°25'23.2的建筑物的JSON文件“ E坐标。

我可以使用同一网站获取位于其他位置的建筑物的JSON文件吗?例如,对于在新加坡的位置(缩放比例为15),我相信使用XYZ瓦片坐标的X,Y坐标将为25835和5221,相应的网址为https://data.osmbuildings.org/0.2/anonymous/tile/15/25835/5221.json。 但是,当我将其放入网络浏览器时,我没有像柏林案例中那样得到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

1 个答案:

答案 0 :(得分:1)

如果未获取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。将其链接(根据https://osmbuildings.org/documentation/data/),我们得到

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

它确实返回了大约40座建筑物的JSON数据。

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

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

返回一个包含命名建筑物的JSON,例如“ Marina Bay Sands Tower 1 ”,“ Marina Bay Sands Tower 2 ”等,表明该方法有效按预期。

相关问题