Mam plik ASCII o szerokości i długości geograficznej oraz data_val w następującym formacie.
35-13.643782N, 080-57.190157W, 118.6
...
Mam plik obrazu GeoTiff i mogę go łatwo wyświetlić.
Chcę umieścić „pinezkę” (może być kropką / flagą / gwiazdą lub czymkolwiek najłatwiejszym) na obrazie na określonej szerokości / długości geograficznej znalezionej w pliku ASCII.
Oto, co udało mi się dotychczas zrobić:
Mój obraz źródłowy wygląda następująco:
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
...
Oto, co udało mi się połączyć w Pythonie:
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
Ale nie jestem w stanie dowiedzieć się, jak umieścić „czerwoną kropkę” na 35-13.643782N, 080-57.190157W
Muszę się tutaj nauczyć kilku nowych szczegółów (nomenklatura na temat GIS).
python
gdal
latitude-longitude
geotiff-tiff
ascii
Brad Walker
źródło
źródło
Odpowiedzi:
Twój
gdalinfo
wynik pokazuje, że masz pojedynczy pasmo GeoTIFF z tabelą kolorów (paleta AKA). Nie widzę wartości w tej tabeli kolorów, więc poniższe polecenia konwertują tablicę jednopasmową i kolorową na trzypasmowy GeoTIFF RGB. Polecenia zakładają również, że plik ASCII ma wiersz nagłówka i współrzędne w stopniach dziesiętnych, w razie potrzeby może być konieczne zmodyfikowanie pliku.Wejścia:
Proces:
Ostatnie polecenie wykonuje następujące czynności:
gdal_rasterize
Wynik:
źródło
Dobry początek.
gdal.CreateCopy
zajmie się georeferencją, więc nie musisz ustawiać tego ponownie za pomocą geotransformy i projekcji.Cały proces przekształci współrzędne lon / lat w współrzędne XY odniesienia przestrzennego rastra. Następnie te współrzędne XY zostaną przekształcone w wiersz, indeksy col rastra za pomocą odwrotnej geotransformy. Pewna wartość w pikselach zostanie zapisana w tej pozycji.
Notatka 1:
Polecenie
gdal.RasterBand.WriteArray(array, xoff, yoff)
działa z lewego górnego rogu. W tym przykładzie podaję tablicę 1x1 o wartości 255,xoff
a więcyoff
są to rzeczywiste indeksy wiersza, cola dla pozycji lon / lat. Jeśli chcesz napisać kwadrat 3x3, musisz dopasowaćxoff
iyoff
odejmując 1. Powinieneś także upewnić się, że typ danych tablicy pasuje do rastra. Ponieważ powiedziałeś, że chcesz „czerwonej kropki”, zakładam, że są trzy pasma uint8.źródło