Ответы:
Я не могу придумать ни сервиса, ни легкодоступного инструмента. Но если вы чувствуете себя комфортно в командной строке и готовы потратить некоторое время на работу, вот способ, который может работать
Как только вы создадите стиль, экспортируйте его как PNG с географической привязкой .
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
Используйте gdal_translate, чтобы преобразовать его в GeoTIFF.
gdal_translate -of GTiff -a_srs <desired projection, probably EPSG:3857, as above> <desired file name>.png <desired file name>.tiff
Я тоже не знаю инструмента. Если вам неудобно работать в командной строке, я бы скачал данные из OSM, загрузил в настольную ГИС и экспортировал GeoTiff ИЛИ использовал QGIS с этим плагином, а затем создал бы пустой Geotif для интересующей вас области, а затем посмотрим, сможете ли вы объединить данные в пустой файл. Я не пробовал это в QGIS, но с некоторой работой это должно быть возможно. Вы должны проверить условия лицензирования для OSM, прежде чем делать это.
Я предполагаю, что у вас уже есть базовая таблица стилей и соответствующая заливка холмов - в противном случае см. Страницу 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