มีบริการสำหรับการส่งออกแผนที่ OpenStreetMap (OSM) ที่อ้างอิงทางภูมิศาสตร์ในรูปแบบ GeoTiff หรือไม่


คำตอบ:


10

ไม่มีบริการหรือเครื่องมือที่พร้อมใช้งานที่ฉันสามารถคิดได้ แต่ถ้าคุณพอใจในบรรทัดคำสั่งและยินดีที่จะใช้เวลาแก้ไขบางอย่างนี่เป็นวิธีที่สามารถทำงานได้

  1. ดาวน์โหลด OSM shapefile
  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 โหลดลงในเดสก์ท็อป GIS และส่งออก 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.