Существует ли служба для экспорта карт OpenStreetMap (OSM) с географической привязкой в ​​формате GeoTiff?


12

Доступен ли сервис для экспорта карт OpenStreetMap (OSM) с географической привязкой в ​​формате GeoTiff?

Ответы:


10

Я не могу придумать ни сервиса, ни легкодоступного инструмента. Но если вы чувствуете себя комфортно в командной строке и готовы потратить некоторое время на работу, вот способ, который может работать

  1. Загрузите шейп-файл OSM.
  2. Импортируйте шейп-файл в TileMill. ,
  3. Как только вы создадите стиль, экспортируйте его как PNG с географической привязкой .

    • Следующая команда должна работать после установки nik2img ; он создаст файл PNG и соответствующий мировой файл из вашего экспорта 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. Используйте gdal_translate, чтобы преобразовать его в GeoTIFF.

    • Следующая команда должна работать: gdal_translate -of GTiff -a_srs <desired projection, probably EPSG:3857, as above> <desired file name>.png <desired file name>.tiff

Кто-нибудь делал это? Я дошел до создания файла мира PNG +, но не могу понять, как заставить gdal_translate использовать файл мира. Похоже, что начиная с версии 0.6, nik2img должен производить GeoTIFF напрямую, но в моем тестировании этого не произошло.
Z O.

2

Я тоже не знаю инструмента. Если вам неудобно работать в командной строке, я бы скачал данные из OSM, загрузил в настольную ГИС и экспортировал GeoTiff ИЛИ использовал QGIS с этим плагином, а затем создал бы пустой Geotif для интересующей вас области, а затем посмотрим, сможете ли вы объединить данные в пустой файл. Я не пробовал это в QGIS, но с некоторой работой это должно быть возможно. Вы должны проверить условия лицензирования для OSM, прежде чем делать это.


Если вы сохраните текущее представление QGIS как изображение PNG, вы также получите файл мира, то есть GeoTIFF - это всего лишь быстрое преобразование gdal_translate ....
Spacedman

0

Я предполагаю, что у вас уже есть базовая таблица стилей и соответствующая заливка холмов - в противном случае см. Страницу github для вашей таблицы стилей (например, 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))

Файл конфигурации ( osm.cfg) выглядит так:

[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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.