GDALSetProjection使用的一个注意事项
GDALSetProjection 简述
GDALSetProjection
是用来给GDALDataset
设定投影信息(坐标系统)的接口,实际上是GDALDataset::SetProjection
这个虚函数的转调而已。官网文档描述如下:
**CPLErr GDALDataset::SetProjection (const char * pszProjection ) **
Set the projection reference string for this dataset.
The string should be in OGC WKT or PROJ.4 format. An error may occur because of incorrectly specified projection strings, because the dataset is not writable, or because the dataset does not support the indicated projection. Many formats do not support writing projections.
This method is the same as the CGDALSetProjection()
function.
Parameters
pszProjection projection reference string.
Returns
CE_Failure if an error occurs, otherwise CE_None.
按照这里描述的,传入的参数可以是OGC WKT
或者PROJ.4
格式的字符串,但是可能在写入坐标系信息的时候发生错误,因为数据集不可写。或者数据集不支持对应的坐标系,很多格式不支持写入。
注意事项
这里要说的就是这个函数使用的时候要注意的地方,因为这是一个虚函数,在基类GDALDataset
中的定义是直接返回CE_Failure
的,派生出的各个格式有自己的实现。
因为每个派生出的格式对SetProjection
的实现可能都不一致,所以这里使用的时候就需要根据不同的格式传入不同的参数。
例如GTiff
就不支持PROJ.4
格式的字符串,只能是OGC WKT
格式的。
又比如,MBTiles
格式支持EPSG:3857
,其他的就不支持了。
又比如,NTIF
格式,也仅支持WKT
格式字符串传入,且只支持WGS84
地理坐标或者UTM
投影坐标。
OGC出的GeoPackage
格式是支持最好的,支持各种用户输入格式,支持各种坐标系,几乎没有限制。
HDF4
格式就很简单粗暴了,不做任何验证,传入什么就复制什么.
下面贴出GTiff
和MBTiles
两种格式对SetProjection
的实现。
GDALDataset::SetProjection
CPLErr GDALDataset::SetProjection( CPL_UNUSED const char *pszProjection )
{
if( !(GetMOFlags() & GMO_IGNORE_UNIMPLEMENTED) )
ReportError(CE_Failure, CPLE_NotSupported,
"Dataset does not support the SetProjection() method.");
return CE_Failure;
}
GTiffDataset::SetProjection
CPLErr GTiffDataset::SetProjection( const char * pszNewProjection )
{
if( bStreamingOut && bCrystalized )
{
CPLError(
CE_Failure, CPLE_NotSupported,
"Cannot modify projection at that point in "
"a streamed output file" );
return CE_Failure;
}
LoadGeoreferencingAndPamIfNeeded();
LookForProjection();
if( !STARTS_WITH_CI(pszNewProjection, "GEOGCS")
&& !STARTS_WITH_CI(pszNewProjection, "PROJCS")
&& !STARTS_WITH_CI(pszNewProjection, "LOCAL_CS")
&& !STARTS_WITH_CI(pszNewProjection, "COMPD_CS")
&& !STARTS_WITH_CI(pszNewProjection, "GEOCCS")
&& !EQUAL(pszNewProjection,"") )
{
CPLError( CE_Failure, CPLE_AppDefined,
"Only OGC WKT Projections supported for writing to GeoTIFF. "
"%s not supported.",
pszNewProjection );
return CE_Failure;
}
if( EQUAL(pszNewProjection, "") &&
pszProjection != NULL &&
!EQUAL(pszProjection, "") )
{
bForceUnsetProjection = true;
}
CPLFree( pszProjection );
pszProjection = CPLStrdup( pszNewProjection );
bGeoTIFFInfoChanged = true;
return CE_None;
}
MBTilesDataset::SetProjection
CPLErr MBTilesDataset::SetProjection( const char* pszProjection )
{
if( eAccess != GA_Update )
{
CPLError(CE_Failure, CPLE_NotSupported,
"SetProjection() not supported on read-only dataset");
return CE_Failure;
}
OGRSpatialReference oSRS;
if( oSRS.SetFromUserInput(pszProjection) != OGRERR_NONE )
return CE_Failure;
if( oSRS.GetAuthorityName(NULL) == NULL ||
!EQUAL(oSRS.GetAuthorityName(NULL), "EPSG") ||
oSRS.GetAuthorityCode(NULL) == NULL ||
!EQUAL(oSRS.GetAuthorityCode(NULL), "3857") )
{
CPLError(CE_Failure, CPLE_NotSupported,
"Only EPSG:3857 supported on MBTiles dataset");
return CE_Failure;
}
return CE_None;
}
GDALSetProjection使用的一个注意事项的更多相关文章
- asp.net mvc3 数据验证(四)—Remote验证的一个注意事项
原文:asp.net mvc3 数据验证(四)-Remote验证的一个注意事项 前几篇把asp.net mvc3 中基于Model的主要数据验证的方法都已经讲完了,本节纯粹只是讲一个我 ...
- 用new Image().src作LOG统计的一个注意事项 .
用new Image().src作LOG统计的一个注意事项 2009-08-06 17:40 在大型网站做很多用户行为分析.产品的策划方案基本上都是通过分析用户的访问等信息而做出的,LOG信息的统计准 ...
- Apache万网SSl证书安装不成功的一个注意事项(https安全链接,基于phpstudy)
最近,微信小程序挺火,要做小程序网站域名必须要有ssl证书,形成https://的安全链接,我于是从万网上下载了一个免费的ssl证书,按照万网提供的安装方式怎么也安装不好,最后我这个Apache小白费 ...
- Lattice FIFO 使用之FIFO_DC输入输出宽度不同时 的一个注意事项
在使用FIFO_DC的时候,我们知道这个FIFO的一个功能是可以输入输出的数据宽度不一样,比如: 输入数据为128bit,输出数据为16bit,FIFO内部可以实现这样的转换,但是输出的时候是先送出一 ...
- Mysql使用mysqldump按时间导出时的一个注意事项
在使用Mysql的mysqldump命令按时间进行数据导出时,我们可能会遇到导出数据与原库中不符或者导出数据和我们期望的数据不同的情况. 我们知道Mysql数据库导出可以使用命令mysqldump,使 ...
- [原创]Android Handler使用Message的一个注意事项
最近发现了一个莫名其妙的问题,在使用Handler.post(Runnable)这个接口时,Runnable有时候没有运行,非常奇怪,后来发现是因为调用Handler.removeMessage()时 ...
- MVC-Model数据注解(三)-Remote验证的一个注意事项
首先,一般来说对于一个属性的验证可能需要不止一个的远程验证,比如对于用户名来说,我们需要对于它的长度做一些限制,这个可以通过StringLength特性来解决:同时还需要验证用户名不能重复,这个就需要 ...
- 关于php中openssl_public_encrypt无填充的一个注意事项
昨天在使用openssl_public_encrypt函数rsa加密一些数据传输的时候,怎么都是加密失败. if (openssl_public_encrypt($data, $encrypted, ...
- 一个注意事项:内部类引用的外部变量必须是final的
之前写过一个项目,好久没更新了,最近翻起以前的代码,发现在这里报了一个错.(现在转到Intellij了,从前在Eclipse luna中是可以编译通过的,Eclipse mars也会报错,JDK版本都 ...
随机推荐
- yield()方法就是礼让,具体还是看cpu怎么分配
package charpter07; //yield():礼让的行为public class Processor implements Runnable { @Override public voi ...
- 微信支付支付宝支付生成二维码的方法(php生成二维码的三种方法)
如果图简单,可以用在线生成 http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.xinzhenkj.com 最简单 ...
- hdu 2680 多起点一终点
注意这是一个有向图! 多起点,一终点 反过来,看成一个起点,多个终点,找最短路 因为是有向图 所以u->v 要也要反过来成为v->u Sample Input5 8 5 //结点数 边数 ...
- poj 1321 棋盘问题(n行中放任意k行)
n*n的棋盘摆K的棋子,任意两个棋子不能在同一行同一列 Sample Input 2 1#. //# 可放.#4 4...#..#..#..#...-1 -1Sample Output 21 # i ...
- HTML5游戏 围住神经猫 开发
所有文章搬运自我的个人主页:sheilasun.me 去年风靡微信朋友圈的小游戏"围住神经猫",我也试着做了一下,可以戳这里试玩→围住神经猫.游戏是用Egret引擎开发的,因为Eg ...
- SQL中IN和EXISTS用法的区别
结论 1. in()适合B表比A表数据小的情况 2. exists()适合B表比A表数据大的情况 当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用. select * fro ...
- python常用内建模块--base64
Base64是一种任意二进制到文本字符串的编码方法,常用于在URL.Cookie.网页中传输少量二进制数据. import base64 a = 'abcdef/+'b= base64.b64enco ...
- K-means聚类算法及python代码实现
K-means聚类算法(事先数据并没有类别之分!所有的数据都是一样的) 1.概述 K-means算法是集简单和经典于一身的基于距离的聚类算法 采用距离作为相似性的评价指标,即认为两个对象的距离越近,其 ...
- 008 Spark中standalone模式的HA(了解,知道怎么配置即可)
standalone也存在单节点问题,这里主要是配置两个master. 1.官网 2.具体的配置 3.配置方式一(不是太理想) 这种知识基于未来可以重启,但是不能在宕机的时候提供服务. 方式一:Sin ...
- hibernate update 只更新部分字段的3种方法(转载)
hibernate 中如果直接使用 Session.update(Object o); 会把这个表中的所有字段更新一遍. 比如: public class Teacher Test { @Test p ...