J'ai un fichier ASCII avec latitude, longitude et data_val dans le format suivant.
35-13.643782N, 080-57.190157W, 118.6
...
J'ai un fichier image GeoTiff et je peux facilement le visualiser.
Je veux placer une "épingle" (peut être un point / drapeau / étoile ou ce qui est le plus simple) sur l'image à la position de latitude / longitude spécifique trouvée dans le fichier ASCII.
Voici ce que j'ai réussi à faire jusqu'à présent:
Mon image source ressemble à ceci:
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
...
Voici ce que j'ai réussi à bricoler ensemble en Python:
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
Mais, je n'arrive pas à comprendre comment placer un "point rouge" à 35-13.643782N, 080-57.190157W
Je dois apprendre de nouveaux détails ici (nomenclature sur les SIG).
python
gdal
latitude-longitude
geotiff-tiff
ascii
Brad Walker
la source
la source
Réponses:
Votre
gdalinfo
sortie montre que vous avez une seule bande GeoTIFF avec une table de couleurs (palette AKA). Je ne peux pas voir les valeurs dans cette table de couleurs, donc les commandes ci-dessous convertissent la seule bande + table de couleurs en GeoTIFF RVB à trois bandes. Les commandes supposent également que votre fichier ASCII a une ligne d'en-tête et des coordonnées en degrés décimaux, vous devrez peut-être modifier votre fichier si ce n'est pas le cas.Contributions:
Processus:
La dernière commande effectue les opérations suivantes:
gdal_rasterize
Résultat:
la source
Vous avez un bon départ.
gdal.CreateCopy
prendra en charge le géoréférencement, vous n'avez donc pas à le définir une deuxième fois en utilisant la géotransformation et la projection.Le processus complet transformera les coordonnées lon / lat en coordonnées XY de la référence spatiale raster. Ensuite, ces coordonnées XY seront transformées en indices de ligne, col du raster en utilisant la géotransformation inverse. Une valeur de pixel sera écrite à cette position.
Note 1:
La commande
gdal.RasterBand.WriteArray(array, xoff, yoff)
fonctionne à partir du coin supérieur gauche. Dans cet exemple, je fournis un tableau 1x1 avec la valeur 255, doncxoff
etyoff
sont la ligne réelle, les indices col pour la position lon / lat. Si vous voulez écrire un carré 3x3, vous devez ajusterxoff
etyoff
en soustrayant 1. Vous devez également vous assurer que le type de données du tableau correspond à celui du raster. Parce que vous avez dit que vous vouliez un "point rouge", je suppose qu'il y a trois bandes de uint8.la source