2
我已經地理參考TIFF,gdalinfo輸出上的GeoTIFF的頂部巴布亞新幾內亞:疊加在指定的座標
Driver: GTiff/GeoTIFF
Files: generated.tiff
generated.tiff.aux.xml
Size is 6941, 4886
Coordinate System is `'
GCP Projection =
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0],
UNIT["degree",0.0174532925199433],
AUTHORITY["EPSG","4326"]]
GCP[ 0]: Id=1, Info=
(0,0) -> (0.01,0.05886,0)
GCP[ 1]: Id=2, Info=
(6941,0) -> (0.07941,0.05886,0)
GCP[ 2]: Id=3, Info=
(6941,4886) -> (0.07941,0.01,0)
GCP[ 3]: Id=4, Info=
(0,4886) -> (0.01,0.01,0)
Metadata:
AREA_OR_POINT=Area
Software=paint.net 4.0
Image Structure Metadata:
INTERLEAVE=BAND
Corner Coordinates:
Upper Left ( 0.0, 0.0)
Lower Left ( 0.0, 4886.0)
Upper Right (6941.0, 0.0)
Lower Right (6941.0, 4886.0)
Center (3470.5, 2443.0)
有含有的地圖標記圖像第二文件 - 稱爲marker1.png(36x60像素)。
我想覆蓋上面generated.tiff頂部的marker1.png - 因此它的左上角位於geotiff文件的座標0.037,0.025處。目測結果應該看起來像是一個谷歌地圖,上面有一個標記。
我該如何去實現它?
我設法部分實現了這一點,但我不確定這是否是正確的路徑。
import gdal
gdal.UseExceptions()
s = gdal.Open('generated.tiff')
drv = gdal.GetDriverByName("VRT")
vrt = drv.CreateCopy('test.vrt', s, 0)
band = vrt.GetRasterBand(1)
source_path = 'marker1.png'
source_band = 1
x_size = 36
y_size = 60
x_block = 36
y_block = 1
x_offset = 0
y_offset = 0
x_source_size = 36
y_source_size = 60
dest_x_offset = 2000
dest_y_offset = 2000
x_dest_size = 36
y_dest_size = 60
simple_source = '<SimpleSource><SourceFilename relativeToVRT="1">%s</SourceFilename>' % source_path + \
'<SourceBand>%i</SourceBand>' % source_band + \
'<SourceProperties RasterXSize="%i" RasterYSize="%i" DataType="Byte" BlockXSize="%i" BlockYSize="%i"/>' % (x_size, y_size, x_block, y_block) + \
'<SrcRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/>' % (x_offset, y_offset, x_source_size, y_source_size) + \
'<DstRect xOff="%i" yOff="%i" xSize="%i" ySize="%i"/></SimpleSource>' % (dest_x_offset, dest_y_offset, x_dest_size, y_dest_size)
band.SetMetadata({'source_0': simple_source}, "new_vrt_sources")
band.SetMetadataItem("NoDataValue", '1')
p = gdal.GetDriverByName("PNG")
p.CreateCopy('result.png', vrt, 0)
vrt = None
這是採用像素座標而不是地理的人(但轉換是很容易),但標記圖像顯示爲黑色斑點(但有正確的尺寸) - 看起來像調色板可能是錯的?
很難說沒有樣本數據。你標記PNG是一個調色8位文件?如果是這樣,我認爲您需要將'ColorInterp'標籤添加到您的VRT並將其設置爲'Palette'。還可以從PNG中讀取顏色表並將其添加到VRT中。可以用'GetRasterColorTable'完成讀取,它應該放在VRT中的ColorTable標籤中。 – 2014-10-21 12:12:46
現在標記是調色板PNG,我還沒有能夠從geotiff和標記中合併調色板,因此標記顏色是錯誤的。我確信有一個明顯的解決方案,我只是還沒有想出它 除此之外 - 是否有使用調色板文件而不是RGBA的優勢,反之亦然?對於RGBA,VRT更加冗長(因爲有3或4個樂隊),但除此之外呢? – 2014-10-21 14:59:01