Geotiffread & getting latlon info

14 vues (au cours des 30 derniers jours)
Raghavendra Mupparthy
Raghavendra Mupparthy le 6 Juin 2011
Hello,
I am using EO-1 Hyperion data (hyperspectral) as a geotiff image data of Agatti Islands, Lakshadweep, India. I used geotiffread to read the image data.. using [img, RfrncMtrx, BndgBx]=geotiffread(phileName{:}); When I want to convert from the row/col to lat/lon by using pix2latlon, I get the numbers in map-scale. (Actually the values in the reference matrix are also huge!!!???). The BndgBx=[179100, 1155270; 206430, 1244100]..
Kindly let me know where I am going wrong?
Cheers
Raghu
  3 commentaires
Hyunglok Kim
Hyunglok Kim le 19 Oct 2017
Luka's answer is the best.
Nirajan Luintel
Nirajan Luintel le 4 Avr 2018
I used to calculate from boundary box. Its a lot easier. Thanks a lot

Connectez-vous pour commenter.

Réponse acceptée

Kelly Luetkemeyer
Kelly Luetkemeyer le 8 Juin 2011
Modifié(e) : Kelly Luetkemeyer le 21 Juin 2022
Here is updated code to adress this request using recent (R2022a) features in Mapping Toolbox:
%% Read image file using readgeoraster
fname = "boston.tif";
[A,R] = readgeoraster(fname);
%% Create grid of X,Y values
[x,y] = worldGrid(R);
%% Convert grid of X,Y values to latitude/longitude
[lat,lon] = projinv(R.ProjectedCRS,x,y);
%% Plot latitude/longitude min/max on geographic axes to confirm
[latlim,lonlim] = geoquadline(lat,lon);
figure
geoplot(latlim([1 2 2 1 1]),lonlim([1,1,2,2,1]),"r","LineWidth",2)
geobasemap satellite
title("geographic axes")
figure
mapshow(A,R)
title("boston.tif")
********************************
Hi Raghu,
As background information, the coordinates of your image are in a projected coordinate system rather than a geographic coordinate system. You can use the function GEOTIFFINFO to return the information structure.
You will see the 'ModelType' field set to 'ModelTypeProjected'; therefore, the RefMatrix is also referenced to map coordinates.
Beginning in R2011a, you will also see a new field, SpatialRef, which in this case will contain a spatialref.MapRasterReference object.
If you want to find the geographic coordinates from the map coordinates, then you need to use the function PROJINV to unproject the coordinates to latitude and longitude.
Here is how you would find the latitude and longitude values for the center of the first pixel in boston.tif:
info = geotiffinfo('boston.tif');
[x,y] = pix2map(info.RefMatrix, 1, 1);
[lat,lon] = projinv(info, x,y)
Beginning in R2011a, you can use:
[x,y] = pix2map(info.SpatialRef, 1, 1)
or
R = info.SpatialRef;
[x,y] = R.intrinsicToWorld(1,1);
followed by:
[lat,lon] = projinv(info, x,y);
I hope this help you.
-Kelly
  5 commentaires
TT1981
TT1981 le 1 Sep 2016
I know this is a really old post, but since I was struggling with the same as OP and there are not many posts online related to this, I would like to include a solution to shorten computing time:
[AY, AX]= size (data);
lon = zeros(size(data));
lat = zeros(size(data));
x = zeros(1, AX);
y = zeros(1, AY);
height = info.Height; % Integer indicating the height of the image in pixels
width = info.Width; % Integer indicating the width of the image in pixels
[rows,cols] = meshgrid(1:height,1:width);
% Getting the latitude and longitude of the points
[x,y] = pix2map(info.RefMatrix, rows, cols);
[lat,lon] = projinv(info, y,x);
This way you do not need to loop through all the points.
Tom Bell
Tom Bell le 24 Fév 2019
You made my day! Thank you!

Connectez-vous pour commenter.

Plus de réponses (3)

Reema Alhassan
Reema Alhassan le 4 Juin 2018
hello, when I'm using projinv(info, y,x); function I'm getting an error says the GeoTIFF structure PROJ can't be used with the functions PROJFWD or PROJINV if you could help me please ..
thank you
  7 commentaires
Sophia Barth
Sophia Barth le 21 Août 2020
This is the code i used to export the image:
If you have an account for Google Earth Engine it should work when you click on the link. If the link somehow doesnt work this is the code:
/**
* Function to mask clouds using the Sentinel-2 QA band
* @param {ee.Image} image Sentinel-2 image
* @return {ee.Image} cloud masked Sentinel-2 image
*/
function maskS2clouds(image) {
var qa = image.select('QA60');
// Bits 10 and 11 are clouds and cirrus, respectively.
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
// Both flags should be set to zero, indicating clear conditions.
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0));
return image.updateMask(mask).divide(10000);
}
//Filter images
var dataset = ee.ImageCollection('COPERNICUS/S2')
.filterBounds(geometry5)
//.filterDate('2016-07-23','2016-07-27')
.filterDate('2020-07-01','2020-07-30')
.filterMetadata('CLOUDY_PIXEL_PERCENTAGE','less_than',20)
.map(maskS2clouds)
.median()
.select(['B12','B8','B4'])
//visualization parameter
var SWIRVis = {
min: 0.0,
max: 0.3,
bands: ['B12', 'B8', 'B4'],
};
//output image, add to map
var final_image = dataset.clip(geometry5)
Map.addLayer(final_image,SWIRVis,'Image2016-06');
//Map.addLayer(final_image,VisParam,'image201607_1_fire');
//Export the image, specifying scale and region
Export.image.toDrive({
image: final_image,
description: 'image202007_swir_small',
scale: 20,
crs: 'EPSG:3857',
region: geometry5
});
I hope that helps, thanks again!
Sophia Barth
Sophia Barth le 21 Août 2020
As a next step I dowloaded the image from Googe Drive and used the follwoing code as you suggested:
info = geotiffinfo('image202007_swir_small.tif');
[x,y] = pix2map(info.RefMatrix, 1, 1);
[lat,lon] = projinv(info, x,y)

Connectez-vous pour commenter.


Ran Zask
Ran Zask le 24 Mar 2018
I think it should be [lat,lon] = projinv(info, x,y);
  1 commentaire
Qishun Ran
Qishun Ran le 19 Juin 2019
I think you are right, it should be [lat,lon] = projinv(info, x,y); and
it should be [rows,cols] = meshgrid(1:width,1:height);

Connectez-vous pour commenter.


Andres Rey Sanchez
Andres Rey Sanchez le 26 Juil 2021
Some corrections are needed to the answers above. To get the correct matrices of coordinates (lat, lon) from your geotiff the code should be:
info = geotiffinfo('boston.tif');
height = info.Height; % Integer indicating the height of the image in pixels
width = info.Width; % Integer indicating the width of the image in pixels
[cols,rows] = meshgrid(1:width,1:height);
[x,y] = pix2map(info.RefMatrix, rows, cols);
[lat,lon] = projinv(info, x,y);

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by