Czy istnieje usługa eksportowania georeferencyjnych map OpenStreetMap (OSM) w formacie GeoTiff?

12

Czy dostępna jest usługa eksportowania georeferencyjnych map OpenStreetMap (OSM) w formacie GeoTiff?

desputin
źródło

Odpowiedzi:

10

Nie ma usługi ani łatwo dostępnego narzędzia, o którym mógłbym myśleć. Ale jeśli czujesz się komfortowo w wierszu poleceń i chcesz poświęcić trochę czasu na majsterkowanie, oto sposób, który może działać

  1. Pobierz plik kształtu OSM.
  2. Zaimportuj plik kształtu do TileMill. .
  3. Po stylizowaniu wyeksportuj go jako PNG z georeferencją .

    • Następujące polecenie powinno działać po zainstalowaniu nik2img ; wygeneruje plik PNG i pasujący plik świata z eksportu 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. Użyj gdal_translate, aby przekonwertować go na GeoTIFF.

    • Następujące polecenie powinno działać: gdal_translate -of GTiff -a_srs <desired projection, probably EPSG:3857, as above> <desired file name>.png <desired file name>.tiff
myśli przestrzenne
źródło
Czy ktoś to zrobił? Dotarłem tak daleko do stworzenia pliku światowego PNG +, ale nie mogę wymyślić, jak uzyskać gdal_translate do korzystania z pliku światowego. Wygląda na to, że od wersji 0.6 nik2img ma produkować GeoTIFF bezpośrednio, ale nie wydaje mi się, że w moich testach.
Z O.
2

Nie znam też narzędzia. Jeśli nie czujesz się komfortowo w wierszu poleceń, pobrałbym dane z OSM, załadowałem do pulpitu GIS i wyeksportowałem GeoTiff LUB użyj QGIS z tą wtyczką, a następnie utwórz pusty Geotif dla obszaru, który Cię interesuje, a następnie sprawdź, czy możesz scalić dane w pusty plik. Nie próbowałem tego w QGIS, ale przy odrobinie pracy powinno to być możliwe. Zanim to zrobisz, musisz sprawdzić warunki licencyjne dla OSM.

Nate
źródło
Jeśli zapiszesz bieżący widok QGIS jako obraz PNG, otrzymasz również plik świata, co oznacza, że ​​GeoTIFF to tylko szybka konwersja gdal_translate ...
Spacedman 10'15
0

Zakładam, że masz już skonfigurowany podstawowy arkusz stylów i odpowiednie cieniowanie wzgórza - w przeciwnym razie zobacz stronę github dla swojego arkusza stylów (np. 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))

Plik konfiguracyjny ( osm.cfg) wygląda następująco:

[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
źródło