Existe serviço para exportar mapas georreferenciados do OpenStreetMap (OSM) no formato GeoTiff?


12

Existe um serviço disponível para exportar mapas OpenStreetMap (OSM) georreferenciados no formato GeoTiff?

Respostas:


10

Não há nenhum serviço ou ferramenta prontamente disponível em que eu possa pensar. Mas se você estiver confortável na linha de comando e disposto a gastar algum tempo mexendo, aqui está uma maneira de trabalhar

  1. Faça o download do shapefile OSM.
  2. Importe o shapefile para o TileMill. .
  3. Depois de estilizado, exporte-o como um PNG georreferenciado .

    • O comando a seguir deve funcionar depois de instalar o nik2img ; ele produzirá um arquivo PNG e um mundo correspondente a partir da exportação do 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 convertê-lo em um GeoTIFF.

    • O seguinte comando deve funcionar: gdal_translate -of GTiff -a_srs <desired projection, probably EPSG:3857, as above> <desired file name>.png <desired file name>.tiff

Alguém já fez isso? Cheguei a produzir o arquivo mundial PNG +, mas não consigo descobrir como fazer com que o gdal_translate use o arquivo mundial. Parece que a partir da versão 0.6, o nik2img deveria produzir GeoTIFF diretamente, mas não aparece nos meus testes.
Z O.

2

Também não conheço uma ferramenta. Se você não estiver confortável com a linha de comando, eu baixaria os dados do OSM, carregaria em um GIS da área de trabalho e exportaria um GeoTiff OU usaria o QGIS com este plug-in e criaria um Geotif vazio para a área de seu interesse e, em seguida, veja se você pode mesclar os dados no arquivo vazio. Eu não tentei isso no QGIS, mas com algum trabalho deve ser possível. Você deve verificar os termos de licença do OSM antes de fazer isso.


Se você salvar a exibição QGIS atual como uma imagem PNG você também terá um arquivo de mundo, o que significa um GeoTIFF é apenas uma conversão gdal_translate rápida away ....
Spacedman

0

Suponho que você já tenha a sua folha de estilo básica e as colinas relevantes configuradas - caso contrário, consulte a página do github da sua folha de estilo (por exemplo, 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))

O arquivo de configuração ( osm.cfg) se parece com:

[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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.