Ich habe eine ASCII-Datei mit Breiten-, Längen- und Datenwert im folgenden Format.
35-13.643782N, 080-57.190157W, 118.6
...
Ich habe eine GeoTiff-Bilddatei und kann sie problemlos anzeigen.
Ich möchte einen "Stift" (kann ein Punkt / eine Flagge / ein Stern oder was auch immer am einfachsten ist) auf dem Bild an der spezifischen Breiten- / Längengradposition platzieren, die in der ASCII-Datei gefunden wird.
Folgendes habe ich bisher geschafft:
Mein Quellbild sieht folgendermaßen aus:
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
...
Folgendes habe ich in Python zusammengeschustert:
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
Aber ich kann nicht genau herausfinden, wie man einen "roten Punkt" bei 35-13.643782N, 080-57.190157W platziert
Ich muss hier einige neue Details lernen (Nomenklatur über GIS).
python
gdal
latitude-longitude
geotiff-tiff
ascii
Brad Walker
quelle
quelle
Antworten:
Ihre
gdalinfo
Ausgabe zeigt, dass Sie ein Einzelband-GeoTIFF mit einer Farbtabelle (AKA-Palette) haben. Ich kann die Werte in dieser Farbtabelle nicht sehen, daher konvertieren die folgenden Befehle die Einzelband- + Farbtabelle in ein Drei-Band-RGB-GeoTIFF. Die Befehle setzen auch voraus, dass Ihre ASCII-Datei eine Kopfzeile und Koordinaten in Dezimalgraden hat. Möglicherweise müssen Sie Ihre Datei ändern, wenn dies nicht der Fall ist.Eingaben:
Prozess:
Der letzte Befehl führt Folgendes aus:
gdal_rasterize
Ergebnis:
quelle
Du hast einen guten Start.
gdal.CreateCopy
kümmert sich um die Georeferenzierung, so dass Sie dies nicht ein zweites Mal mithilfe der Geotransform und der Projektion einstellen müssen.Der gesamte Prozess transformiert die Lon / Lat-Koordinaten in die XY-Koordinaten des Raster-Raumbezugs. Dann werden diese XY-Koordinaten unter Verwendung der inversen Geotransform in die Zeilen- und Spaltenindizes des Rasters umgewandelt. An dieser Position wird ein Pixelwert geschrieben.
Anmerkung 1:
Der Befehl wird
gdal.RasterBand.WriteArray(array, xoff, yoff)
in der oberen linken Ecke ausgeführt. In diesem Beispiel liefern I ein 1x1 - Array mit dem Wert 255, so ,xoff
undyoff
sind die tatsächlichen Zeile, Spalte Indizes für die lon / lat Position. Wenn Sie ein 3x3-Quadrat schreiben möchten, müssen Sie es anpassenxoff
undyoff
durch Subtrahieren von 1. Sie sollten auch sicherstellen, dass der Array-Datentyp mit dem des Rasters übereinstimmt. Da Sie sagten, Sie möchten einen "roten Punkt", gehe ich davon aus, dass es drei Bänder von uint8 gibt.quelle