GDAL краска TIF с шейп-файлом - PullRequest
0 голосов
/ 16 октября 2018

По сути, я хочу создать новое изображение белого цвета, где нет объектов, и черного цвета там, где есть объект.

Я не знаю ни одного API, который бы позволял такие преобразования.

<= Изменить Я пытаюсь найти другое решение, получить координаты пикселей для каждого объекта и затем создать изображение </p>

Вот код

def retrieve_pixel_value(geo_coord, data_source):
    from affine import Affine
    x, y = geo_coord[0], geo_coord[1]
    forward_transform =  \
    Affine.from_gdal(*data_source.GetGeoTransform())
    reverse_transform = ~forward_transform
    px, py = reverse_transform * (x, y)
    px, py = int(px + 0.5), int(py + 0.5)
    pixel_coord = px, py
    return (pixel_coord)

Но это не такКажется, работает источник: https://gis.stackexchange.com/questions/221292/retrieve-pixel-value-with-geographic-coordinate-as-input-with-gdal

<= Редактировать 2 Создал эту функцию </p>

def createFeatureTable(shp_filename , src_filename):
    from osgeo import gdal,ogr
    import osgeo.ogr
    osgeo.ogr.UseExceptions()
    import struct
    from PIL import Image

    ds=osgeo.ogr.Open(shp_filename)
    lyr=ds.GetLayer()

    driver = gdal.GetDriverByName('GTiff')
    dataset = gdal.Open(src_filename)
    band = dataset.GetRasterBand(1)

    cols = dataset.RasterXSize
    rows = dataset.RasterYSize

    transform = dataset.GetGeoTransform()

    xOrigin = transform[0]
    yOrigin = transform[3]
    pixelWidth = transform[1]
    pixelHeight = -transform[5]

    data = band.ReadAsArray(0, 0, cols, rows)
    pixel_coords = []
    print("Checkpoint 1")
    for feat in lyr:
        geom = feat.GetGeometryRef()
        ring = geom.GetGeometryRef(0)
        points = ring.GetPointCount()

        for p in range(0,points):
            x,y,z = ring.GetPoint(p)
            cord = x,y
            res = retrieve_pixel_value(cord,dataset)
            pixel_coords.append(res)
    import numpy as np
    img = np.zeros([7532,5462,3],dtype=np.uint8)
    img.fill(255) # or img[:] = 255
    print("Checkpoint 3")
    for coordinate in pixel_coords:
        img[coordinate[0],coordinate[1],0] = 0
        img[coordinate[0],coordinate[1],1] = 0
        img[coordinate[0],coordinate[1],2] = 0
    print("Checkpoint 4")

    image = Image.fromarray(img, 'RGB')
    image.save('testOut.jpg')

Пример вывода:

EO1

Как видите, функции не заполнены, а линии не идеальны

...