Existe-t-il un service pour exporter des cartes OpenStreetMap géoréférencées (OSM) au format GeoTiff?


12

Existe-t-il un service permettant d'exporter des cartes OpenStreetMap géoréférencées (OSM) au format GeoTiff?

Réponses:


10

Il n'y a aucun service ou outil facilement disponible auquel je peux penser. Mais si vous êtes à l'aise sur la ligne de commande et prêt à passer du temps à bricoler, voici un moyen qui peut fonctionner

  1. Téléchargez le fichier de formes OSM.
  2. Importez le fichier de formes dans TileMill. .
  3. Une fois que vous l'avez stylisé, exportez-le au format PNG géoréférencé .

    • La commande suivante devrait fonctionner une fois que vous avez installé nik2img ; il produira un fichier PNG et un monde correspondant à partir de votre exportation TileMill: nik2img.py <TileMill export name>.xml <desired file name>.png -d <pixel width> <pixel height> --srs <desired projection, probably 900913> --bbox <bounding box parameters> -v -w pgw
  4. Utilisez gdal_translate pour le convertir en GeoTIFF.

    • La commande suivante devrait fonctionner: gdal_translate -of GTiff -a_srs <desired projection, probably EPSG:3857, as above> <desired file name>.png <desired file name>.tiff

Quelqu'un a-t-il fait cela? J'ai réussi à produire le fichier mondial PNG +, mais je ne peux pas trouver comment obtenir que gdal_translate utilise le fichier mondial. Il semble qu'à partir de la version 0.6, nik2img est censé produire directement GeoTIFF, mais cela n'apparaît pas dans mes tests.
Z O.

2

Je ne connais pas non plus d'outil. Si vous n'êtes pas à l'aise sur la ligne de commande, je téléchargerais les données depuis OSM, les chargerais dans un SIG de bureau et exporterais un GeoTiff OU utiliserais QGIS avec ce plugin et créerais ensuite un Geotif vide pour la zone qui vous intéresse et ensuite voyez si vous pouvez fusionner les données dans le fichier vide. Je n'ai pas essayé cela dans QGIS, mais avec du travail, cela devrait être possible. Vous devrez vérifier les conditions de licence pour OSM avant de le faire.


Si vous enregistrez la vue QGIS actuelle en tant qu'image PNG, vous obtenez également un fichier mondial, ce qui signifie qu'un GeoTIFF n'est qu'une conversion rapide de gdal_translate ....
Spacedman

0

Je suppose que vous avez déjà configuré votre feuille de style de base et l'ombrage pertinent - sinon consultez la page github pour votre feuille de style (par exemple https://github.com/hotosm/HDM-CartoCSS )

#!/usr/bin/python

from datetime import datetime
from subprocess import call

import ConfigParser
import math
import dateutil.tz

roughLatRadius = 110574
roughLonRadius = 111111

description = 'Generated from OSM data - unknown date'
copyright = '(C) OpenStreetMap contributors, see http://www.openstreetmap.org/copyright'

def getDimensions(lon, lat, geosize, scale):
    latDims = geosize * roughLatRadius / scale
    lonDims = geosize * math.cos(math.radians(lat)) * roughLonRadius / scale
    return str(int(math.ceil(lonDims))) + " " + str(int(math.ceil(latDims)))

def renderOneImage(lon, lat, geosize, scale):

    dims = getDimensions(lon, lat, geosize, scale)

    extent = str(lon) + " " + str(lat) + " " + str(lon + geosize) + " " + str(lat + geosize)
    output_file = "osm_hot_" + extent.replace(" ", "_") + "_" + str(scale) + "m" + ".tif"
    temp_file = "temp.png"

    now = datetime.utcnow().replace(tzinfo=dateutil.tz.gettz('UTC')).isoformat()
    print "Generating", output_file

    call("nik2img.py --format=RGB24 --world-file=pgw --mapnik-version=1 --dimensions " + dims + " --srs=4326 --no-open --bbox " + extent + " osm_hot_style.xml " + temp_file, shell=True)

    call('gdal_translate -a_srs EPSG:4326 -q -mo "TIFFTAG_ARTIST=WhoEver" -mo "TIFFTAG_IMAGEDESCRIPTION=' + description + '" -mo "TIFFTAG_COPYRIGHT=' + copyright + '" -mo "TIFFTAG_DOCUMENTNAME=OSM Humanitarian Style map - ' + str(scale) + 'm per pixel" -mo "TIFFTAG_DATETIME=' + now + '" ' + temp_file + " " + output_file, shell=True)

def makerange(start, end, step):
    while start < end:
        yield start
        start += step

def renderImages(min_x, min_y, max_x, max_y, stepsize, scale):
    for lon in makerange(min_x, max_x, stepsize):
        for lat in makerange(min_y, max_y, stepsize):
            renderOneImage(lon, lat, stepsize, scale)

if __name__ == '__main__':
    config = ConfigParser.ConfigParser()
    config.read('osm.cfg')
    description = 'Generated from OSM data as of ' + config.get('Metadata', 'ExtractDate', 0)
    copyright = config.get('Metadata', 'CopyrightStatement', 0)
    for scale in ['100', '50', '20', '10', '5', '2', '1', '0.5']:
        for entry in config.items(scale):
            (entry_name, entry_value) = entry
            (min_x, min_y, max_x, max_y, stepsize) = entry_value.split(',')
            renderImages(float(min_x), float(min_y), float(max_x), float(max_y), float(stepsize), float(scale))

Le fichier de configuration ( osm.cfg) ressemble à:

[Metadata]
ExtractDate: 2015-03-05T21:21:02Z
CopyrightStatement: (C) OpenStreetMap contributors, see http://www.openstreetmap.org/copyright

[100]
# around 2 degree steps are good at 100 metres
phillipines: 118, 4, 127, 20, 2


[50]
# around 1-2 degree steps are good at 50 metres
phillipines: 118, 4, 127, 20, 1

[20]
# around 0.5 to 1 degree steps are good at 20 metres
samar: 124, 11, 126, 13, 0.5
northwest: 120, 12.4, 124.5, 14.5, 0.5
northofmanila: 120, 14.5, 122.4, 19.6, 0.5


[10]
# roughly 0.4 degree steps are sane at 10 metres

[5]
# around 0.2 degree steps are good at 5 metres

[2]
# around 0.1 degree steps are good at 2 metres
guiuan: 125.5, 10.9, 125.8, 11.1, 0.1
tacloban: 124.8, 11.1, 125.1, 11.4, 0.1
legazpi: 123.5, 13.1, 123.8, 14.5, 0.1
manila: 120.8, 14.2, 121.2, 14.7, 0.1
subicbay: 120.1, 14.7, 120.4, 15.0, 0.1

[1]
# around 0.05 degree steps are good at 1 metre

[0.5]
# around 0.02 degree steps are good at 0.5 metres
tacloban: 124.8, 11.1, 125.1, 11.4, 0.02
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.