2014-10-19 1 views
2

Я привязки размолвки, выходные gdalinfo:Overlay детские на вершине 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 пикселей).

Я хочу наложить marker1.png поверх вышеуказанного сгенерированного.tiff - чтобы его верхний левый угол находился в координатах 0.037,0.025 файла геотипа. Визуально результат должен выглядеть как карта google с одним маркером поверх нее.

Как я мог бы достичь этого?

Мне удалось частично реализовать это, но я не уверен, что это правильный путь.

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 

Это использует пиксельные координаты вместо географических единиц (но это преобразование легко), однако маркерные изображения отображаются в виде черных сгустков (но с правильными размерами) - выглядит как палитра может быть не так?

+0

Его трудно сказать без данных образца. Является ли маркер PNG палированным 8-битным файлом? Если это так, я думаю, вам нужно добавить тег ColorInterp в свой VRT и установить его в «Palette». А также прочитайте таблицу цветов из PNG и добавьте ее в VRT. Чтение может быть выполнено с помощью «GetRasterColorTable», и оно должно быть помещено в тег «ColorTable» в VRT. –

+0

Прямо сейчас маркер палит PNG, и мне еще не удалось объединить цветовые палитры с geotiff и маркером, и в результате цвета маркера ошибочны. Я уверен, что есть очевидное решение для этого, я просто еще не понял его. Это в стороне - есть ли какие-либо преимущества использования палированных файлов над RGBA или наоборот? С RGBA VRT гораздо более подробный (потому что есть 3 или 4 диапазона), но кроме этого? –

ответ

1

Я пробовал несколько разных подходов, никто не работал должным образом - цвета были неправильными, прозрачность была неправильной или неправильной.

Наконец-то я сделал это с помощью PIL с кодом ниже. Это всего лишь несколько строк, на самом деле читаемые (в отличие от всего, что я мог придумать с помощью gdal), а самое главное - он работает.

Конечно, его можно улучшить.

from PIL import Image, ImageFont, ImageDraw 
from osgeo import gdal,ogr 

image = 'generated.tiff' 
src_ds = gdal.Open(image) 
gt = src_ds.GetGeoTransform() # used to convert geographical coordinates to pixel coordinates 

font = ImageFont.truetype("sans-serif.ttf", 16) 

img = Image.open(image) 

def add_marker (gt, watermark, font, img, mx, my, text): 
    px = int((mx - gt[0])/gt[1]) #x pixel 
    py = int((my - gt[3])/gt[5]) #y pixel 


    wmark = Image.open(watermark) 
    draw = ImageDraw.Draw(wmark) 
    draw.text((12, 10), text, (0, 0, 0), font=font) 

    img.paste(wmark, (px, py), wmark) 

add_marker(gt, 'marker1.png', font, img, 0.012, 0.0132, "1") 

img.save("result.png", "PNG") 

 Смежные вопросы

  • Нет связанных вопросов^_^