Saya memiliki file ASCII dengan garis lintang, bujur, dan data_val dalam format berikut.
35-13.643782N, 080-57.190157W, 118.6
...
Saya memiliki file gambar GeoTiff, dan saya dapat dengan mudah melihatnya.
Saya ingin menempatkan "pin" (bisa berupa titik / bendera / bintang atau apa pun yang paling mudah) pada gambar di posisi lintang / bujur tertentu yang ditemukan dalam file ASCII.
Inilah yang telah saya lakukan sejauh ini:
Gambar sumber saya terlihat seperti ini:
Driver: GTiff/GeoTIFF
Files: /tmp/Charlotte SEC 100.tif
Size is 16867, 12358
Coordinate System is:
PROJCS["Lambert Conformal Conic",
GEOGCS["NAD83",
DATUM["North_American_Datum_1983",
SPHEROID["GRS 1980",6378137,298.2572221010042,
AUTHORITY["EPSG","7019"]],
AUTHORITY["EPSG","6269"]],
PRIMEM["Greenwich",0],
UNIT["degree",0.0174532925199433],
AUTHORITY["EPSG","4269"]],
PROJECTION["Lambert_Conformal_Conic_2SP"],
PARAMETER["standard_parallel_1",38.66666666666666],
PARAMETER["standard_parallel_2",33.33333333333334],
PARAMETER["latitude_of_origin",34.11666666666667],
PARAMETER["central_meridian",-78.75],
PARAMETER["false_easting",0],
PARAMETER["false_northing",0],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]]]
Origin = (-365041.822331817995291,240536.419747152860509)
Pixel Size = (42.334586069440391,-42.334898968590878)
Metadata:
AREA_OR_POINT=Area
TIFFTAG_DATETIME=2016:06:24 12:46:45
TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
TIFFTAG_SOFTWARE=Adobe Photoshop CS5 Windows
TIFFTAG_XRESOLUTION=300
TIFFTAG_YRESOLUTION=300
Image Structure Metadata:
COMPRESSION=LZW
INTERLEAVE=BAND
Corner Coordinates:
Upper Left ( -365041.822, 240536.420) ( 82d48'55.43"W, 36d13' 4.92"N)
Lower Left ( -365041.822, -282638.262) ( 82d35'10.11"W, 31d30'17.00"N)
Upper Right ( 349015.641, 240536.420) ( 74d51'46.40"W, 36d13'26.16"N)
Lower Right ( 349015.641, -282638.262) ( 75d 4'55.60"W, 31d30'36.99"N)
Center ( -8013.091, -21050.921) ( 78d50'12.11"W, 33d55'36.35"N)
Band 1 Block=16867x1 Type=Byte, ColorInterp=Palette
Color Table (RGB with 256 entries)
0: 255,255,255,255
...
Berikut adalah apa yang saya berhasil atur bersama di Python:
from osgeo import gdal, osr
src_filename = '/tmp/Charlotte SEC 100.tif'
dst_filename = '/tmp/foo.tiff'
# Opens source dataset
src_ds = gdal.Open(src_filename)
format = "GTiff"
driver = gdal.GetDriverByName(format)
# Open destination dataset
dst_ds = driver.CreateCopy(dst_filename, src_ds, 0)
# Specify raster location through geotransform array
# (upperleftx, scalex, skewx, upperlefty, skewy, scaley)
# Scale = size of one pixel in units of raster projection
# this example below assumes 100x100
gt = [-365041.822, 100, 0, 240536.420, 0, -100]
# Set location
dst_ds.SetGeoTransform(gt)
# Get raster projection
epsg = 4269 # http://spatialreference.org/ref/sr-org/lambert_conformal_conic_2sp/
srs = osr.SpatialReference()
srs.ImportFromEPSG(epsg)
dest_wkt = srs.ExportToWkt()
# Set projection
dst_ds.SetProjection(dest_wkt)
# Close files
dst_ds = None
src_ds = None
Tapi, saya tidak tahu bagaimana cara menempatkan "titik merah" di 35-13.643782N, 080-57.190157W
Saya harus mempelajari beberapa perincian baru di sini (nomenklatur tentang SIG).
python
gdal
latitude-longitude
geotiff-tiff
ascii
Brad Walker
sumber
sumber
Jawaban:
gdalinfo
Output Anda menunjukkan Anda memiliki satu band GeoTIFF dengan tabel warna (AKA palette). Saya tidak bisa melihat nilai-nilai dalam tabel warna itu sehingga perintah di bawah ini mengubah tabel warna + pita tunggal menjadi tiga pita RGB GeoTIFF. Perintah juga menganggap file ASCII Anda memiliki baris tajuk dan memiliki koordinat dalam derajat desimal, Anda mungkin perlu memodifikasi file Anda jika tidak.Input:
Proses:
Perintah terakhir melakukan hal berikut:
gdal_rasterize
Hasil:
sumber
Anda memiliki awal yang baik.
gdal.CreateCopy
akan menangani georeferensi, sehingga Anda tidak perlu mengatur itu untuk kedua kalinya menggunakan geotransform dan proyeksi.Proses yang lengkap akan mengubah lon / lat coords menjadi koordinat XY dari referensi spasial raster. Kemudian koordinat XY ini akan ditransformasikan menjadi baris, indeks col dari raster menggunakan geotransform terbalik. Beberapa nilai piksel akan ditulis pada posisi itu.
Catatan 1:
Perintah
gdal.RasterBand.WriteArray(array, xoff, yoff)
beroperasi dari sudut kiri atas. Dalam contoh ini saya menyediakan array 1x1 dengan nilai 255, jadixoff
danyoff
merupakan baris aktual, indeks col untuk posisi lon / lat. Jika Anda ingin menulis kotak 3x3, Anda perlu menyesuaikanxoff
danyoff
dengan mengurangi 1. Anda juga harus memastikan bahwa datatype array cocok dengan raster. Karena Anda mengatakan Anda ingin "titik merah", saya mengasumsikan ada tiga band uint8.sumber