Search code examples
jsongisopenstreetmapcoordinate-transformation

Retrieving JSON data from the osmbuildings.org data site


I am trying to retrieve building data from osmbuildings.org

The osmbuildings documentation (https://osmbuildings.org/documentation/data/) features an example URL (https://data.osmbuildings.org/0.2/anonymous/tile/15/17605/10743.json) that returns the JSON file for buildings that are located in Berlin at roughly 52°32'30.6"N 13°25'23.2"E coordinates.

Can I use this same site to get a JSON file for buildings in a different location? For example, I believe the X,Y coordinates using XYZ tile coordinates would be 25835 and 5221 for a location in Singapore for a zoom of 15 and the corresponding url would be https://data.osmbuildings.org/0.2/anonymous/tile/15/25835/5221.json. However, when I put this into the web browser, I don't get the json file like in the Berlin case. Can someone please explain?

I also tried different zoom values at the same location: https://data.osmbuildings.org/0.2/anonymous/tile/16/51672/8779.json

And at a slightly different location with fewer buildings: https://data.osmbuildings.org/0.2/anonymous/tile/16/51666/9459.json


Solution

  • If you do not get the JSON file, you are probably getting an empty reply. This is likely because your specified tile does not contain any building data.

    This can have various reasons, e.g. there are regions where no building data is available. In your case however, it seems to me that your conversion into X,Y coordinates is not correct for Singapore.

    In my following example, I use the coordinates for the Singapore Marina Bay (https://www.openstreetmap.org/#map=15/1.2742/103.8617).

    I converted the lon/lat to tile numbers using the formula from the OSM wiki (https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames). In pseudo code:

    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
    

    Filling in the according lon = 103.8617 and lat = 1.2742 and zoom = 15, you get:

    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
    

    Disregarding the decimals, we get X = 25837 and Y = 16268. Making this into a link (according to https://osmbuildings.org/documentation/data/), we get

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

    which does return JSON data for some 40 buildings.

    This also worked fine for me on other zoom levels. E.g. zooming in on the famous "Marina Bay Sands" (https://www.openstreetmap.org/#map=17/1.28338/103.86148) and calculating the link according to the pseudo-code above, I get:

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

    which returns a JSON that contains named buildings such as "Marina Bay Sands Tower 1", "Marina Bay Sands Tower 2", etc., which shows it worked as intended.