「gdaljava坐标」gdal java
本篇文章给大家谈谈gdaljava坐标,以及gdal java对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、基于GDAL遥感影像镶嵌
- 2、c# gdal 判断两个影像的重叠度,影像是有坐标信息的,先谢谢您的回答!
- 3、java如何获取任意一个点的海拔
- 4、gdal导入地图怎么获取单位
- 5、c++,gdal,GCPS为获取地理坐标,报错求解答!
- 6、GDAL怎么用函数读取12位的图像信息
基于GDAL遥感影像镶嵌
对一幅或若干幅图像通过预处理、几何镶嵌、色调调整、去重叠等处理,镶嵌到一起生成一幅大的图像的影像处理方法 。
镶嵌之前应确保两幅影像经过了几何配准,具有相同的投影
1、产生一个空白文件(用于放置镶嵌结果,坐标系统和要镶嵌的图像完全一致,大小能容纳拟镶嵌图像之和 )
2、读入第一幅影像,将其设置参考图像,以其地理坐标及投影信息作为拼接后的影像地理坐标及投影信息
3、读入第二幅图像
4、对于重叠区处理 匀色处理、直方图匹配、镶嵌线设置,这里只进行了均值匀色
由于遥感正射影像通常具有黑色背景0值,重叠区匀色时应忽略0值
待镶嵌影像为两幅经过几何纠正的全色影像
c# gdal 判断两个影像的重叠度,影像是有坐标信息的,先谢谢您的回答!
gdal没有这样计算的函数吧,你自己读出两个影像的长和宽,又有坐标信息,坐标重叠的地方,就是长和宽的重叠啊。其实又不难,自己算完全可以的。
java如何获取任意一个点的海拔
由于大部分地图API不提供海拔这一参数,所以海拔要单独计算。
搭建好基于Java的GDAL运行环境和相关的配置
参数 坐标点 以及 需要读取的高程数据(底图)
package com.chinalbs.qhxm.util;
import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;
public class AltitudeUtil {undefined
public static void main(String[] args){undefined
//参数经纬度(小数形式)
Integer selectAltitude = SelectAltitude(100.3445, 37.003);
System.out.println(“海拔是:”+selectAltitude+“米”);
}
public static Integer SelectAltitude (double lon,double lat){undefined
//海拔
Integer altitude =0;
//支持所有驱动
gdal.AllRegister();
//要读取的文件,经纬度不可超过查询地图的范围,否则结果为null
//海拔读取为DEM高程数据
String fileName_tif = “C:/Users/Tysheng/Desktop/海北州高程数据/HAIBEIZHOU_DEM.TIF”;
//只读方式读取数据
Dataset hDataset = gdal.Open(fileName_tif, gdalconstConstants.GA_ReadOnly);
//支持中文路径
gdal.SetConfigOption(“gdal_FILENAME_IS_UTF8”, “YES”);
//判断是否非空
if (hDataset == null)
{undefined
System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo());
System.err.println(gdal.GetLastErrorMsg());
System.exit(1);
}
//图像的列和行
Driver hDriver = hDataset.GetDriver();
int iXSize = hDataset.getRasterXSize();
int iYSize = hDataset.getRasterYSize();
Band band = hDataset.GetRasterBand(1);
int buf[] = new int[iXSize];
//循环遍历取出像元值
for(int i=0; iiYSize; i++){undefined
}
gdal导入地图怎么获取单位
1、通过GDAL读取经纬度(度分秒),转换成小数形式。
2、使用GDAL的CoordinateTransformation方法将经纬度转换成投影坐标,再转换成行列坐标,最后读取像元值。就可以获取单位了。
c++,gdal,GCPS为获取地理坐标,报错求解答!
影像投影转换就是将一个地理坐标系统转换到另一个坐标系统,如果在同一个椭球基准面下的转换就是严密的转换,如果在同一个椭球体不同基准面的转换是不严密的,不同椭球体之间的转换是不严密的,这就需要用到七参数、三参数等方法。需要两个不同坐标系统下公共点坐标求得系数。例如北京54和WG4-84坐标下的同一点的经纬度或者是经过投影后的平面坐标也是不同的。那么影像投影主要分为哪些步骤呢?说白了,就三个步骤,第一,坐标转换;第二,影像的重采样,最后就是写入到新文件中。
首先来说第一步,坐标转换需要转换四个坐标,也就是四个角点。也许有人说两个点就够了,左下点和右上点。在此,我告诉你,这是错误的。投影转换后这个四个角点组成的矩形那么很有可能就不是矩形了,如果你取两个点做转换那么后面的影像投影转换后的范围就不正确了。
或者再有人问,我怎么知道影像的四个角点的坐标啊?这个很简单,通过仿射变换系数,它就是影像的像素坐标(行列号)和地理坐标之间进行关联的系数。一般是六个参数。在GDAL中可以通过以下这个函数来获得,如果影像有仿射变换系数的话。如果没有仿射变换系数但是有控制点的话也能解算出系数;如果都没有,说明这幅影像是没有地理参考的,那么狠遗憾的告诉你,这个影像就不能做投影转换。还有就是,如果你这幅影像没有投影的话也就不能做投影转换了,因为你根本不知道这幅影像的投影是啥。
CPLErr GDALDataset::GetGeoTransform
(
double *
padfTransform
)
其中padfTransform就存储了这六个参数。这是个六个double型的数的数组。
在向北向的图像中,padfTransform[1]代表像素宽度,padfTransform[5]代表像素高度。图像左上角的坐标是(padfTransform[0],padfTransform[3]),adfGeoTransform[1] X方向也就是横向的分辨率大小,padfTransform [2] 旋转系数,如果为0,就是标准的正北向图像,padfTransform [4] 旋转系数,如果为0,就是标准的正北向图像,知道了这两个参数的意义,那么我们就可以得到四个角点的地理坐标了。
在正北向的图像中,四个角点的坐标计算如下:
//计算源图像的MBR
double dbX[4];
double dbY[4];
double dbZ[4] = {0,0,0,0};
dbX[0] = adfDstGeoTransform[0]; //左上角点坐标
dbY[0] = adfDstGeoTransform[3];
//右上角坐标
dbX[1] = adfDstGeoTransform[0] + nXsize*adfDstGeoTransform[1];
dbY[1] = adfDstGeoTransform[3];
//右下角点坐标
dbX[2] = adfDstGeoTransform[0] + nXsize*adfDstGeoTransform[1] + nYsize*adfDstGeoTransform[2];
dbY[2] = adfDstGeoTransform[3] + nXsize*adfDstGeoTransform[4] + nYsize*adfDstGeoTransform[5];
//左下角坐标
dbX[3] = adfDstGeoTransform[0];
dbY[3] = adfDstGeoTransform[3] + nYsize*adfDstGeoTransform[5];
这样我们就找到了需要参与投影转换的坐标点了,下一步就是坐标转换,坐标转换的过程通过GDAL的接口实现,其底层依赖了PROJ4地图投影开源类库。对于不同的椭球体之间变换需要用到三参数布尔莎或者七参数布尔莎模型,具体过程就是首先将经纬度大地坐标转换为地心坐标系下的空间直角坐标,然后用布尔莎模型计算,最后将计算后的结果重新转换到目标地理坐标系统下的经纬度大地坐标。有了需要转换的坐标后,我们将对上述四个点的坐标进行变换,其函数如下:
[cpp] view plain copy
bool TranformCoordsOGR(char* pszSrcWkt,char* pszDestWkt, int nCount,double* x,double* y,double* z
,double *dfParaSrc,double* dfParaDst,int nParaCount)
{
//创建OGR的空间参考系
OGRSpatialReference oSrcSrs; //源坐标系统
OGRSpatialReference oDestSrs; //目的坐标系统
oSrcSrs.importFromWkt(pszSrcWkt);
oDestSrs.importFromWkt(pszDestWkt);
int nSameGeoCS = oSrcSrs.IsSameGeogCS(oDestSrs);
//相同的椭球基准面,则进行转换
if (nSameGeoCS)
{
OGRCoordinateTransformation *poCT = NULL;
poCT = OGRCreateCoordinateTransformation( oSrcSrs,oDestSrs );
if (NULL == poCT)
{
return false;
}
int nFlag = poCT-Transform(nCount,x,y,z);
if (nFlag)
{
OGRCoordinateTransformation::DestroyCT(poCT);
return true;
}
return false;
}
else //不同的椭球体基准面,要设置七参数或者三参数
{
int nFlag = 0;
//如果是地理坐标系,直接转换为空间直角坐标
OGRErr err = 0;
double dbAsrc = 0;
double dbBsrc = 0;
double dbEsrc = 0;
dbAsrc = oSrcSrs.GetSemiMajor(err);
dbBsrc = oSrcSrs.GetSemiMinor(err);
dbEsrc = 1-pow((dbBsrc/dbAsrc),2.0);
if (oSrcSrs.IsProjected())
{
OGRSpatialReference* poTmpSRS = oSrcSrs.CloneGeogCS();
OGRCoordinateTransformation *poCTTmp = NULL;
poCTTmp = OGRCreateCoordinateTransformation( oSrcSrs,poTmpSRS );
nFlag = poCTTmp-Transform(nCount,x,y,z);
if (!nFlag)
{
OGRCoordinateTransformation::DestroyCT(poCTTmp);
return false;
}
OGRCoordinateTransformation::DestroyCT(poCTTmp);
//pj_geodetic_to_geocentric(dbAsrc,dbEsrc,nCount,0,x,y,z);
}
//将经纬度坐标转换为空间直角坐标
CGeoEllipse geoEllipse(dbAsrc,dbBsrc);
double dbX = 0;
double dbY = 0;
double dbZ = 0;
for (int i = 0; i nCount; i ++)
{
geoEllipse.BLH_XYZ(x[i],y[i],z[i],dbX,dbY,dbZ);
x[i] = dbX;
y[i] = dbY;
z[i] = dbZ;
}
//七参数模型
vectordouble vecX;
vectordouble vecY;
vectordouble vecZ;
for (int i = 0; i nCount; i ++)
{
double dbX = dfParaSrc[0] + (1+dfParaSrc[6])*(x[i]+dfParaSrc[5]*y[i]-dfParaSrc[4]*z[i]);
vecX.push_back(dbX);
double dbY = dfParaSrc[1] + (1+dfParaSrc[6])*(-dfParaSrc[5]*x[i]+y[i]+dfParaSrc[3]*z[i]);
vecY.push_back(dbY);
double dbZ = dfParaSrc[2] + (1+dfParaSrc[6])*(dfParaSrc[4]*x[i]-dfParaSrc[3]*y[i]+z[i]);
vecZ.push_back(dbZ);
}
memcpy(x,vecX[0],sizeof(double)*nCount);
memcpy(y,vecY[0],sizeof(double)*nCount);
memcpy(z,vecZ[0],sizeof(double)*nCount);
double dbAdst = 0;
double dbBdst = 0;
double dbEdst = 0;
dbAdst = oDestSrs.GetSemiMajor(err);
dbBdst = oDestSrs.GetSemiMinor(err);
//再将空间直角坐标转换为地理坐标,即经纬度坐标
CGeoEllipse geoEllipse1(dbAdst,dbBdst);
for (int i = 0; i nCount; i ++)
{
geoEllipse1.XYZ_BLH(x[i],y[i],z[i],dbX,dbY,dbZ);
x[i] = dbX;
y[i] = dbY;
z[i] = dbZ;
}
if (oDestSrs.IsProjected())
{
const char* pszProjName = oDestSrs.GetAttrValue("PROJECTION");
OGRSpatialReference* poTmpSRS = oDestSrs.CloneGeogCS();
int nZone = oDestSrs.GetUTMZone();
char* pszTmp;
poTmpSRS-exportToWkt(pszTmp);
OGRCoordinateTransformation *poCTTmp = NULL;
poCTTmp = OGRCreateCoordinateTransformation( poTmpSRS,oDestSrs );
if (NULL == poCTTmp)
{
//MessageBox(NULL,_T("失败"),_T("提示"),MB_OK);
return false;
}
nFlag = poCTTmp-Transform(nCount,x,y,z);
if (!nFlag)
{
OGRCoordinateTransformation::DestroyCT(poCTTmp);
return false;
}
OGRCoordinateTransformation::DestroyCT(poCTTmp);
return true;
}
return true;
}
return false;
}
上述代码中有空间直角坐标和大地坐标之间的变换,这个是我自己写的,读者也可以使用PROJ中的接口进行变换。
第二步就是影像重采样了,重采样就是通过原始影像的像素值内插得到新到采样点上的像素值。这个可以直接用GDAL中重采样接口来完成。
第三步就不用详细说了,一般投影转换后需要将投影后的影像写入的新文件中,直接用GDAL的读写接口来完成。
二、GDAL影像投影转换的过程中分辨率和仿射变换系数的估算
上一节已经完成了点的投影转换,那么我们现在就要估算投影后的像素分辨率大小和仿射变换系数了。
如果投影变换前是投影坐标系统,投影转换后也是投影坐标系统,或者说另外一种情况:投影变换前是地理坐标系统,投影变换后也是地理坐标系统,并且坐标的单位都一致的,那么分辨率大小基本上没变换,可以用变换前的分辨率大小。如果变换前是地理坐标系统,投影变换后是投影坐标系统,假设地理坐标系统以度为单位,投影坐标系统以米为单位,那么投影后的像素大小可以这样估计,因为经线上一个纬度的距离大约是111km,那么变换后的分辨率可以由原始分辨率乘以111000;相反的话,如果变换前是投影坐标系统,投影变换后是地理坐标系统,假设地理坐标系统以度为单位,投影坐标系统以米为单位,同理投影后的像素大小可以这样估计,变换后的分辨率可以由原始分辨率除以111000。
仿射变换系数这样也就可以确定了,左上角的坐标就是最小x值,最大y值,在变换后的四个角点坐标中比较获得,分辨率上一段也讲了如何获得。对于正北向的图像这就够了。 然后行列数就用变换后的四个角点组成的区域的MBR的宽度除以横向分辨率得到列数,高度除以纵向分辨率得到行数。
附上出处链接:
GDAL怎么用函数读取12位的图像信息
首先,采用GDAL读取图像:
GDALAllRegister();
GDALDataset *poDataset;
QString filename;
filename=QFileDialog::getOpenFileName(this,tr("Choose Images"),tr("All Fles (*.*)"));
//Open the image
QByteArray ba = filename.toLatin1();
poDataset = (GDALDataset*) GDALOpen( ba.data(),GA_ReadOnly );
其次,成功后,可以获取图像的一些基本信息,如下:
描述信息:
const char* GDALDataset::GetDriver()-GetDescription(),通常是图像的格式;
图像大小:
图像宽度:int GDALDataset::GetRasterXSize();
图像高度:int GDALDataset::GetRasterYSize();
波段数:int GDALDataset::GetRasterCount();
投影信息:GDALDataset::GetProjectionRef(),有的图像没有投影信息;
地理坐标信息:double adfGeoTransform[6] GDALDataset::GetGeoTransform(adfGeoTransform);
波段信息:数据集中重要的信息,有波段尺寸、数据类型、颜色信息等;
获取波段的方法:poBand为指向第i个波段的指针
GDALRasterBand *poBand;
poBand = poDataset-GetRasterBand(i);
波段尺寸:
int poBand-GetXSize();
int poBand-GetYSize();
数据类型:const char* GDALGetDataTypeName(poBand-GetRasterDataType());
颜色信息:const char* GDALGetColorInterpretationName(poBand-GetColorInterpretation());
gdaljava坐标的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于gdal java、gdaljava坐标的信息别忘了在本站进行查找喔。