精华内容
下载资源
问答
  • 将栅格图像批量转换为指定的投影,并且批量裁剪和输出。主要利用arcpy,复制粘贴,更改路径,即可轻松实现批量裁剪和投影转换
  • 栅格投影转换.py

    2019-08-10 16:47:19
    本资源采用Python编写基于ARCGIS中arcpy库,数据数据要统一放在同一个文件夹中即可。本资源适合对Python有一定基础者使用。
  • 等经纬度投影转换兰伯特投影 等经纬度投影转换兰伯特投影,实现了gis图片按照经纬度信息进行裁剪。本程序实现了测试实例,采用了命令行传递参数。
  • 投影转换工具

    2018-04-11 10:41:45
    CoordMG,投影转换工具,可以实现单点投影相互转换,如将投影坐标转换为平面坐标等
  • 等经纬度投影转换兰伯特投影,实现了gis图片按照经纬度信息进行裁剪。本程序实现了测试实例,采用了命令行传递参数。
  • IDL 投影转换

    2018-01-02 11:57:23
    IDL 投影转换测试代码,可以为有需要的人提供一些帮助。
  • 使用idl与modis_conversion_toolkit插件,进行MODIS图像批量投影转换
  • 栅格影像WGS84转CGCS2000坐标
  • SuperMap Objects通过七参数设置,进行数据集的投影转换
  • proj4js 投影转换

    2017-12-04 23:07:52
    proj4 javascript投影坐标转换 已测试 可用 准确proj4 javascript投影
  • 实用坐标投影转换.rar

    2020-02-06 22:12:02
    1.北京54坐标系、西安80坐标系、国家2000坐标系和WGS84坐标系的高斯投影正反转换功能。 2.同一坐标系三度投影带与六度投影带之间的相互转换功能。 3.上述坐标系间相互转换功能,可以选三参数、四参数和七参数进行...
  • 在实际应用中,经常需要将点从投影坐标转换成地理坐标,本范例示范了如何将点从投影坐标转换成地理坐标。
  • gadl 基本用法 重采样 重投影函数 封装成动态链接库的形式
  • 这是我最近做的一个投影转换的小工具,在.net的框架下基于AE的二次开发,能实现对单个shp文件的投影变换,如将北京54转成西安80……
  • 在opengl下实现了墨卡托投影和兰伯特投影,数据在data文件夹下,实现了自动投影
  • 批量转换.img格式影像,(WGS84坐标系到CGCS2000坐标系)
  • 扩展iServer实现坐标投影转换,就是调用iObjects java的投影转换的算法来实现点或点串的投影转换,并且扩展为iServer的一个服务。
  • 空间数据编辑及投影转换.doc
  • 程序包含两个函数,其中[Gaussian_X,Gaussian_Y]=convert84BLToGauss(longitude,latitude) 函数将经纬度转为o-xy坐标;[longitude,latitude]=convert84GaussToBL(X,Y) 函数将o-xy坐标转为经纬度;...
  • 该工程是用Objects Java组件为iserver写的一个扩展功能:在服务端实现经纬度点坐标到Albers投影坐标的转换功能,并将转换后的点串坐标值以字符串的形式返回。
  • 投影转换

    千次阅读 2018-06-20 17:11:43
    1、 打开ARCGIS软件——打开编辑工具条——点击... 图1 2、 选择投影坐标系统(注释:坐标系统分投影坐标系统和地理坐标系统,根据地理坐标系统,地面上任一点的位置可由该点的经度和纬度来确定,但地理坐标是一...

    1、 打开ARCGIS软件——打开编辑工具条——点击窗口,打开目录——链接到图像所在的文件夹——打开草海dem所在的文件夹。
     
                                                            图1
          
    2、 选择投影坐标系统(注释:坐标系统分投影坐标系统和地理坐标系统,根据地理坐标系统,地面上任一点的位置可由该点的经度和纬度来确定,但地理坐标是一种球面坐标,难以进行距离、面积、方向等参数的计算。所以,要用平面坐标系统,把地面的点表示在平面上,所以就有了投影坐标系统;适合做景观生态分析)——选高斯克吕格系统(gauss Kruger)——beijing 1954——beijing1954 3 deree GM CM 105E(注释:根据自身画图地点所处的位置来选择相应的经纬度,草海离105E最近,误差最小,所做的分析就越精确)。

    操作步骤:打开工具箱——数据管理工具——投影和变换——要素——定义投影(图2),我们要选的是投影坐标系,beijing1954 3 deree GM CM 105E。


                                                   图2

    3、 选择数据层,右键,属性,源,就可以看到是否定义成功投影。(图3)


     
                                               图3
      4、输出文件为GRID格式。准确来说其实grid属于栅格格式,但不等于栅格格式,回顾一下栅格图像与矢量图像的区别:栅格格式图像其实就是一行一行一列一列的点拼成的图像,对应的矢量格式则是用拓扑信息记录的图形(简单来说,要表示一个封闭三角形,栅格格式用整个三角形区域那么多点来表示这个图像,而矢量则是只记录三角形的三个顶点,然后在拓扑信息上多一个表示这个三角形是实心的项)。有时候栅格图也叫位图,而矢量图有时又分点矢量图、线矢量图、面矢量图等还有很多。
    操作:选中加载的dem图层,点击右键——数据(图4)——空间参考选择当前,点击保存即可。输入名称,选择grid格式,切记,文件路径不能有中文,有中文则会出现保存成错误。
    方法2:还可用转换工具,不过此次并没有用这个方法。(图5)

                                                        图4


     
                                                      图5

    展开全文
  • MODIS数据是以一种新型的投影方式,正弦投影组织的。这种投影方式,尚未被广泛采用,MRT tools 可以把 正弦投影转换为我们熟悉的投影方式!
  • 示例分两个功能:点对象坐标转换和导入记录对象坐标信息Excel构建投影转换之后的数据源。点对象坐标转换输入坐标经纬度转换之后显示其在Albers投影中对应的X、Y值;导入Excel是将Excel中记录的GPS点存储到数据集中,...
  • GDAL影像投影转换

    千次阅读 2018-09-20 14:10:58
    影像投影转换就是将一个地理坐标系统转换到另一个坐标系统,如果在同一个椭球基准面下的转换就是严密的转换,如果在同一个椭球体不同基准面的转换是不严密的,不同椭球体之间的转换是不严密的,这就需...

    https://blog.csdn.net/zhouxuguang236/article/details/17468171

    看到一篇讲的很详细的文章,和大家分享一下,感谢原创博主。 

    一、影像投影转换的概念

    影像投影转换就是将一个地理坐标系统转换到另一个坐标系统,如果在同一个椭球基准面下的转换就是严密的转换,如果在同一个椭球体不同基准面的转换是不严密的,不同椭球体之间的转换是不严密的,这就需要用到七参数、三参数等方法。需要两个不同坐标系统下公共点坐标求得系数。例如北京54WG4-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地图投影开源类库。对于不同的椭球体之间变换需要用到三参数布尔莎或者七参数布尔莎模型,具体过程就是首先将经纬度大地坐标转换为地心坐标系下的空间直角坐标,然后用布尔莎模型计算,最后将计算后的结果重新转换到目标地理坐标系统下的经纬度大地坐标。有了需要转换的坐标后,我们将对上述四个点的坐标进行变换,其函数如下:

    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; } //七参数模型 vector<double> vecX; vector<double> vecY; vector<double> 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的宽度除以横向分辨率得到列数,高度除以纵向分辨率得到行数。

    具体的代码片段如下:

        //转换为PROJ4结构
    	projPJ pj_SourceProjection = NULL, pj_DestinationProjection = NULL;
    	pj_SourceProjection = pj_init_plus(pszSrcProj);
    	pj_DestinationProjection = pj_init_plus(pszDestProj);
    
    	if (pj_is_latlong( pj_SourceProjection ) && !pj_is_latlong(pj_DestinationProjection))
    	{
    		dbRes = dbRes * 111000;
    	}
    
    	else if (!pj_is_latlong( pj_SourceProjection ) &&     
                  pj_is_latlong(pj_DestinationProjection))
    	{
    		dbRes = dbRes / 111000;
    	}
    
    	double dbMinx = 0;
    	double dbMaxx = 0;
    	double dbMiny = 0;
    	double dbMaxy = 0;
    	dbMinx = min(min(min(dbX[0],dbX[1]),dbX[2]),dbX[3]);
    	dbMaxx = max(max(max(dbX[0],dbX[1]),dbX[2]),dbX[3]);
    	dbMiny = min(min(min(dbY[0],dbY[1]),dbY[2]),dbY[3]);
    	dbMaxy = max(max(max(dbY[0],dbY[1]),dbY[2]),dbY[3]);
    
    	//估算行列号
    	adfDstGeoTransform[0] = dbMinx;		//左上角点坐标
    	adfDstGeoTransform[3] = dbMaxy;
    
    	//padfTransform[1] 像素宽度, padfTransform[5]像素高度
    	adfDstGeoTransform[1] = dbRes;
    	adfDstGeoTransform[5] = -dbRes;
    
    	//估算行列数
    	nPixels = ceil(fabs(dbMaxx-dbMinx)/dbRes);
    	nLines = ceil(fabs(dbMaxy-dbMiny)/dbRes);

    三、投影后处理

    投影后处理主要就是重采样和写入数据到新文件中了。

    重采样不多说,主要有最邻近、双线性插值、立方卷积法等。可以直接调用GDAL接口,写入也就不多说了。

    这个在网上有很多这样的代码,包括李民录大哥的博客等。不过还是将代码共享出来

        // 创建输出文件  
    	hDstDS = GDALCreate(hDriver,info.m_strOutputFile.c_str(), nPixels, nLines,GDALGetRasterCount(hSrcDS),eDT,NULL);  
    	CPLAssert( hDstDS != NULL );  
    	// 写入投影  
    	GDALSetProjection( hDstDS,info.m_strOutWkt.c_str());  
    	GDALSetGeoTransform( hDstDS,adfDstGeoTransform );  
    	// 复制颜色表,如果有的话  
    	GDALColorTableH hCT;  
    	hCT = GDALGetRasterColorTable( GDALGetRasterBand(hSrcDS,1));  
    	if( hCT != NULL )  
    		GDALSetRasterColorTable( GDALGetRasterBand(hDstDS,1),hCT ); 
    
    	ProgressCreateEx( &hPolygonizeProgress,_T(""),TRUE,FALSE );
    	ProgressBeginEx( hPolygonizeProgress,PROGRESS_MODE_PERCENT, 100);
    	ProgressSetStepTitleEx( hPolygonizeProgress, _T("图像重投影"));
    
    	// 建立变换选项  
    	GDALWarpOptions* psWarpOptions = GDALCreateWarpOptions();  
    	psWarpOptions->hSrcDS =hSrcDS;  
    	psWarpOptions->hDstDS =hDstDS;  
    
    	int nBandCount = GDALGetRasterCount(hSrcDS);
    	psWarpOptions->nBandCount = nBandCount; 
    	psWarpOptions->panSrcBands =  
    		(int *) CPLMalloc(sizeof(int) * psWarpOptions->nBandCount );  
    	for (int i = 0; i < nBandCount; i ++)
    	{
    		psWarpOptions->panSrcBands[i] = i+1;
    	}
    	psWarpOptions->panDstBands =  
    		(int *) CPLMalloc(sizeof(int) * psWarpOptions->nBandCount );  
    	for (int i = 0; i < nBandCount; i ++)
    	{
    		psWarpOptions->panDstBands[i] = i+1;
    	} 
    
    	psWarpOptions->pfnProgress = ImageReProjectProgress; 
    	psWarpOptions->eResampleAlg = info.m_enResampleAlg;
    
    	// 创建重投影变换函数  
    	psWarpOptions->pTransformerArg =  
    		GDALCreateGenImgProjTransformer( hSrcDS,  
    		GDALGetProjectionRef(hSrcDS),  
    		hDstDS,  
    		GDALGetProjectionRef(hDstDS),  
    		FALSE,0.0, 1 );  
    	psWarpOptions->pfnTransformer = GDALGenImgProjTransform;  
    
    	// 初始化并且执行变换操作  
    	GDALWarpOperation oOperation;  
    	oOperation.Initialize(psWarpOptions );  
    	oOperation.ChunkAndWarpImage(0,0,GDALGetRasterXSize(hDstDS),GDALGetRasterYSize(hDstDS));  
    
    	ProgressEndEx( hPolygonizeProgress );
    	ProgressCloseEx( &hPolygonizeProgress );
    	hPolygonizeProgress=NULL;
    
    	GDALDestroyGenImgProjTransformer(psWarpOptions->pTransformerArg );  
    	GDALDestroyWarpOptions( psWarpOptions );  
    	GDALClose( hDstDS );  
    	GDALClose( hSrcDS );
     
    展开全文
  • 地图投影转换程序

    2016-01-13 11:37:16
    常用地图投影转换,WGS84转背景54,经纬度转大地坐标等等。
  • 栅格数据投影转换

    万次阅读 2018-06-01 23:24:15
    栅格数据投影转换 作者:阿振 邮箱:tanzhenyugis@163.com 博客:https://blog.csdn.net/theonegis/article/details/80089375 修改时间:2018-06-01 声明:本文为博主原创文章,转载请注明原文出处 使用...

    栅格数据投影转换

    作者:阿振

    邮箱:tanzhenyugis@163.com

    博客:https://blog.csdn.net/theonegis/article/details/80089375

    修改时间:2018-06-01

    声明:本文为博主原创文章,转载请注明原文出处


    使用GDAL提供的命令行工具进行转换

    GDAL提供了gdalwarp命令可以方便地让我们进行影像拼接,重投影,裁剪,格式转换等功能

    比如,我们需要将MODIS数据的Sinusoidal投影转为UTM投影,我们可以这样操作。

    我需要转换的地区位于UTM的49度带内,我查看了一下其EPSG的编码为:EPSG:32649(WGS 84 / UTM zone 49N)

    注:推荐大家一个网站,可以查阅各种投影的定义:http://spatialreference.org

    然后,终端中执行如下命令:

    gdalinfo MOD09A1.A2017361.h28v06.006.2018005034659.hdf (用于查看MODIS数据中的波段名称与地址,这里我们只转换第一波段)

    gdalwarp -t_srs EPSG:32649 HDF4_EOS:EOS_GRID:"MOD09A1.A2017361.h28v06.006.2018005034659.hdf":MOD_Grid_500m_Surface_Reflectance:sur_refl_b01 MODSI_WARP_32649.tif-t_srs参数用于指定输出投影信息,可以是EPSG,或者OGC WKT,或者PROJ4格式,后面分别是输入数据和输出数据文件名)

    使用代码进行转换

    使用命令行转换,当然有两种方法啦:

    第一,直接在代码中调用命令行工具的接口(比较懒的人,像我,当然直接用第一种啦,有现成的工具为什么不用);

    第二,自己做投影转换之后的坐标计算,主要是计算重投影之后的GeoTransform参数,有了GeoTransform参数以及投影的定义,我们就可以通过SetGeoTransform()SetProjection()投影转换了.

    下面我给出具体的实现代码:

    第一种方法直接调用gdal.Warp()方法,该方法其实就是对gdalwarp命令的封装,第一个参数是输出文件,第二个参数是输入文件或者输入的Dataset,后面的都是可选参数(dstSRS参数指定输出投影)

    from osgeo import gdal
    
    root_ds = gdal.Open('MOD09A1.A2017361.h28v06.006.2018005034659.hdf')
    # 返回结果是一个list,list中的每个元素是一个tuple,每个tuple中包含了对数据集的路径,元数据等的描述信息
    # tuple中的第一个元素描述的是数据子集的全路径
    ds_list = root_ds.GetSubDatasets()
    
    # 取出第1个数据子集(MODIS反射率产品的第一个波段)进行转换
    # 第一个参数是输出数据,第二个参数是输入数据,后面可以跟多个可选项
    gdal.Warp('reprojection.tif', ds_list[0][0], dstSRS='EPSG:32649')
    
    # 关闭数据集
    root_ds = None

    在介绍第二种方法之前,我们有必要回忆一下之前说过的GDAL反射变换的六参数模型:

    放射变换使用如下的公式表示栅格图上坐标和地理坐标的关系:

    Xgeo=GT(0)+XpixelGT(1)+YlineGT(2)Ygeo=GT(3)+XpixelGT(4)+YlineGT(5) X g e o = G T ( 0 ) + X p i x e l ∗ G T ( 1 ) + Y l i n e ∗ G T ( 2 ) Y g e o = G T ( 3 ) + X p i x e l ∗ G T ( 4 ) + Y l i n e ∗ G T ( 5 )

    Xge0 X g e 0 , Yge0 Y g e 0 )表示对应于图上坐标( Xpixel X p i x e l , Yline Y l i n e )的实际地理坐标。对一个上北下南的图像,GT(2)和GT(4)等于0, GT(1)是像元的宽度, GT(5)是像元的高度的相反数。(GT(0),GT(3))坐标对表示左上角像元的左上角坐标。

    通过这个放射变换,我们可以得到图上所有像元对应的地理坐标。

    好了,所以我们需要计算对于上面的六参数,我们主要需要计算重投影以后图像左上角的坐标(最小的X坐标值和最大的Y坐标值),这个转换我们可以通过osr.CoordinateTransformation类进行,下面给出实现代码:

    from osgeo import gdal
    from osgeo import osr
    
    # root_ds = gdal.Open('/Users/tanzhenyu/Resources/DataWare/MODIS/MOD09A1.A2017361.h28v06.006.2018005034659.hdf')
    # # 返回结果是一个list,list中的每个元素是一个tuple,每个tuple中包含了对数据集的路径,元数据等的描述信息
    # # tuple中的第一个元素描述的是数据子集的全路径
    # ds_list = root_ds.GetSubDatasets()
    #
    # # 取出第1个数据子集(MODIS反射率产品的第一个波段)进行转换
    # # 第一个参数是输出数据,第二个参数是输入数据,后面可以跟多个可选项
    # gdal.Warp('reprojection.tif', ds_list[0][0], dstSRS='EPSG:32649')
    #
    # # 关闭数据集
    # root_ds = None
    
    
    def reproject(src_file, dst_file, p_width, p_height, epsg_to):
        """
        :param src_file: 输入文件
        :param dst_file: 输出文件
        :param p_width: 输出图像像素宽度
        :param p_height: 输出图像像素高度
        :param epsg_to: 输出图像EPSG坐标代码
        :return:
        """
        # 首先,读取输入数据,然后获得输入数据的投影,放射变换参数,以及图像宽高等信息
        src_ds = gdal.Open(src_file)
        src_srs = osr.SpatialReference()
        src_srs.ImportFromWkt(src_ds.GetProjection())
    
        srs_trans = src_ds.GetGeoTransform()
        x_size = src_ds.RasterXSize
        y_size = src_ds.RasterYSize
        d_type = src_ds.GetRasterBand(1).DataType
    
        # 获得输出数据的投影,建立两个投影直接的转换关系
        dst_srs = osr.SpatialReference()
        dst_srs.ImportFromEPSG(epsg_to)
        tx = osr.CoordinateTransformation(src_srs, dst_srs)
    
        # 计算输出图像四个角点的坐标
        (ulx, uly, _) = tx.TransformPoint(srs_trans[0], srs_trans[3])
        (urx, ury, _) = tx.TransformPoint(srs_trans[0] + srs_trans[1] * x_size, srs_trans[3])
        (llx, lly, _) = tx.TransformPoint(srs_trans[0], srs_trans[3] + srs_trans[5] * y_size)
        (lrx, lry, _) = tx.TransformPoint(srs_trans[0] + srs_trans[1] * x_size + srs_trans[2] * y_size,
                                          srs_trans[3] + srs_trans[4] * x_size + srs_trans[5] * y_size)
    
        min_x = min(ulx, urx, llx, lrx)
        max_x = max(ulx, urx, llx, lrx)
        min_y = min(uly, ury, lly, lry)
        max_y = max(uly, ury, lly, lry)
    
        # 创建输出图像,需要计算输出图像的尺寸(重投影以后图像的尺寸会发生变化)
        driver = gdal.GetDriverByName('GTiff')
        dst_ds = driver.Create(dst_file,
                               int((max_x - min_x) / p_width),
                               int((max_y - min_y) / p_height),
                               1, d_type)
        dst_trans = (min_x, p_width, srs_trans[2],
                     max_y, srs_trans[4], -p_height)
    
        # 设置GeoTransform和Projection信息
        dst_ds.SetGeoTransform(dst_trans)
        dst_ds.SetProjection(dst_srs.ExportToWkt())
        # 进行投影转换
        gdal.ReprojectImage(src_ds, dst_ds,
                            src_srs.ExportToWkt(), dst_srs.ExportToWkt(),
                            gdal.GRA_Bilinear)
        dst_ds.GetRasterBand(1).SetNoDataValue(0)  # 设置NoData值
        dst_ds.FlushCache()
    
        del src_ds
        del dst_ds
    
    
    if __name__ == '__main__':
        src_file = 'HDF4_EOS:EOS_GRID:"MOD09A1.A2017361.h28v06.006.2018005034659.hdf":MOD_Grid_500m_Surface_Reflectance:sur_refl_b01'
        dst_file = 'reprojection.tif'
        reproject(src_file, dst_file, 450, 450, 32649)
    展开全文
  • postgis 实现数据库投影转换 1. 第二个语句中region是数据库表名,第二个是列名。最后一个是srid。 转换完毕了。可以用 select st_srid(the_geom) from region这个语句查验。我转换后的可以发布到geoserver上。 2. ...

    postgis 实现数据库投影转换

    1.任意投影转3857
    create view miaopu as select fid,“Id”,面积 as area,ST_Transform(
    ST_SetSRID(the_geom,(select st_srid(the_geom) from xialilinchangmiaopu limit 1
    )),
    3857) as the_geom from xialilinchangmiaopu
    创建了一个一个视图,用于查询3857的投影。
    主要就一个函数ST_Transform.

    展开全文
  • 矢量数据投影转换

    千次阅读 2018-06-04 06:16:55
    矢量数据投影转换 作者:阿振 邮箱:tanzhenyugis@163.com 博客:https://blog.csdn.net/theonegis/article/details/80089375 修改时间:2018-06-03 声明:本文为博主原创文章,转载请注明原文出处 案例...
  • 基于C#平台的高斯投影转换源代码
  • 投影转换工具——utm

    2010-04-16 20:10:56
    投影转换工具——utm投影转换工具——utm投影转换工具——utm

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,899
精华内容 26,759
关键字:

投影转换