¿Existe algún servicio para exportar mapas OpenStreetMap (OSM) georreferenciados en formato GeoTiff?

12

¿Existe un servicio disponible para exportar mapas OpenStreetMap (OSM) georreferenciados en formato GeoTiff?

desputin
fuente

Respuestas:

10

No hay ningún servicio o herramienta disponible que se me ocurra. Pero si se siente cómodo en la línea de comando y está dispuesto a pasar algún tiempo jugando, aquí hay una manera que puede funcionar

  1. Descargue el archivo de forma OSM.
  2. Importe el archivo de forma a TileMill. .
  3. Una vez que lo haya diseñado , expórtelo como PNG georreferenciado .

    • El siguiente comando debería funcionar una vez que haya instalado nik2img ; producirá un archivo PNG y mundial correspondiente a partir de su exportación de 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. Use gdal_translate para convertirlo en un GeoTIFF.

    • El siguiente comando debería funcionar: gdal_translate -of GTiff -a_srs <desired projection, probably EPSG:3857, as above> <desired file name>.png <desired file name>.tiff
pensamientos espaciales
fuente
¿Alguien ha hecho esto? Llegué a producir el archivo mundial PNG +, pero no puedo encontrar la manera de hacer que gdal_translate use el archivo mundial. Parece que a partir de la versión 0.6, se supone que nik2img produce GeoTIFF directamente, pero no aparece en mis pruebas.
Z O.
2

Tampoco conozco una herramienta. Si no se siente cómodo en la línea de comandos, descargaría los datos de OSM, cargaría en un SIG de escritorio y exportaría un GeoTiff O usaría QGIS con este complemento y luego crearía un Geotif vacío para el área que le interesa y luego vea si puede fusionar los datos en el archivo vacío. No lo he intentado en QGIS, pero con algo de trabajo debería ser posible. Deberá verificar los términos de licencia para OSM antes de hacerlo.

Nate
fuente
Si guarda la vista actual de QGIS como una imagen PNG, también obtendrá un archivo mundial, lo que significa que GeoTIFF es solo una conversión rápida de gdal_translate ...
Spacedman
0

Supongo que ya tiene configurada su hoja de estilo básica y el sombreado relevante; de ​​lo contrario, consulte la página de github para su hoja de estilo (por ejemplo, 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))

El archivo de configuración ( osm.cfg) se ve así:

[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
BradHards
fuente