最近在使用GDAL创建PCIDSK格式的矢量数据,发现创建点和线的矢量数据都没问题,创建面状的只有属性表没有图形。在GDAL官网说明也写的是支持的,地址为:http://www.gdal.org/frmt_pcidsk.html。

实在没办法,翻看GDAL源码才发现,SetFeature的时候,只写了wkbPoint和wkbLineString类型,其他的加了句Debug代码如下:

            CPLDebug( "PCIDSK", "Unsupported geometry type in SetFeature(): %s",
poGeometry->getGeometryName() );

这也太……没办法只好自己研究研究补齐了。

通过查看GDAL读取发现,对于面状的矢量,PCIDSK在矢量段里面的属性表里面多存了一个字段,叫RingStart,类型为IntList,用来存储多边形中各个环的起始点号。对于PCIDSK的矢量数据,所有的点都是存储在一个大的数组里面的,对于多边形而言,可能有多个环组成,这些环里面所有的点全部都存在一个数组中,如何来区分每个环的顶点坐标,就需要通过RingStart里面的值来进行分割。知道了存储的原理,那么就按照这个原理将写多边形的部分补上就可以了。修改后的代码如下:

		else if( wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon )
{
OGRPolygon *poPoly = (OGRPolygon *) poGeometry;
int nRingSize = poPoly->getNumInteriorRings(); std::vector<PCIDSK::int32> anRingStart;
anRingStart.resize(nRingSize+1); OGRLinearRing *poRing = NULL;
poRing = poPoly->getExteriorRing();
anRingStart[0] = poRing->getNumPoints(); aoVertices.resize(poRing->getNumPoints());
for(int i = 0; i < aoVertices.size(); i++ )
{
aoVertices[i].x = poRing->getX(i);
aoVertices[i].y = poRing->getY(i);
aoVertices[i].z = poRing->getZ(i);
} for (int iRing=0; iRing < nRingSize; iRing++)
{
int nCurrentStart = aoVertices.size();
poRing = poPoly->getInteriorRing(iRing);
anRingStart[iRing+1] = nCurrentStart + poRing->getNumPoints();
aoVertices.resize(nCurrentStart + poRing->getNumPoints()); for(int i = nCurrentStart; i < aoVertices.size(); i++ )
{
aoVertices[i].x = poRing->getX(i-nCurrentStart);
aoVertices[i].y = poRing->getY(i-nCurrentStart);
aoVertices[i].z = poRing->getZ(i-nCurrentStart);
}
} if(iRingStartField == -1)
{
iRingStartField = poVecSeg->GetFieldCount();
//poVecSeg->AddField( "RingStart", PCIDSK::FieldTypeCountedInt, "", "" );
OGRFieldDefn oField( "RingStart", OFTIntegerList );
//oField.SetWidth(100);
CreateField( &oField );
} std::vector<PCIDSK::ShapeField> aoShapeFields;
poVecSeg->GetFields(id, aoShapeFields); aoShapeFields[iRingStartField].SetValue(anRingStart);
poVecSeg->SetFields( id, aoShapeFields );
}

修改完之后,重新编译GDAL就可以了。

=======================修改于2015年1月9日========================

通过上面的代码是可以生成一个面状的pix文件,使用GDAL打开也没问题,但是使用Focus或者MosaicTool打开的时候会造成这两个程序崩溃,同时属性值显示会有一定点问题。今天再仔细查看了下读取部分的代码,发现对于没有内环的多边形,也就是说一个Feature里面只有一个多边形的时候,不需要写RingStart这个属性值,只有含油内环的时候,也就是多边形中有内环的时候才需要,所以将上面的代码修改为下面的代码:

		else if( wkbFlatten(poGeometry->getGeometryType()) == wkbPolygon )
{
OGRPolygon *poPoly = (OGRPolygon *) poGeometry;
OGRLinearRing *poRing = NULL;
poRing = poPoly->getExteriorRing(); aoVertices.resize(poRing->getNumPoints());
for(int i = 0; i < aoVertices.size(); i++ )
{
aoVertices[i].x = poRing->getX(i);
aoVertices[i].y = poRing->getY(i);
aoVertices[i].z = poRing->getZ(i);
} int nRingSize = poPoly->getNumInteriorRings();
if(nRingSize > 0 )
{
std::vector<PCIDSK::int32> anRingStart;
anRingStart.resize(nRingSize+1);
anRingStart[0] = poRing->getNumPoints(); for (int iRing=0; iRing < nRingSize; iRing++)
{
int nCurrentStart = aoVertices.size();
poRing = poPoly->getInteriorRing(iRing);
anRingStart[iRing+1] = nCurrentStart + poRing->getNumPoints();
aoVertices.resize(nCurrentStart + poRing->getNumPoints()); for(int i = nCurrentStart; i < aoVertices.size(); i++ )
{
aoVertices[i].x = poRing->getX(i-nCurrentStart);
aoVertices[i].y = poRing->getY(i-nCurrentStart);
aoVertices[i].z = poRing->getZ(i-nCurrentStart);
}
} if(iRingStartField == -1)
{
iRingStartField = poVecSeg->GetFieldCount();
OGRFieldDefn oField( "RingStart", OFTIntegerList );
CreateField( &oField );
} std::vector<PCIDSK::ShapeField> aoShapeFields;
poVecSeg->GetFields(id, aoShapeFields);
aoShapeFields[iRingStartField].SetValue(anRingStart);
poVecSeg->SetFields( id, aoShapeFields );
}
}

通过测试发现,这下生成的使用Foucs和MosaicTool可以正常打开,程序也不会出现崩溃的情况,但是属性值显示仍然有点小问题,不过已经不影响使用了。

GDAL不支持创建PCIDSK的面状矢量格式的更多相关文章

  1. 扩展GDAL,支持CNSDTF格式(一)

    扩展GDAL,支持CNSDTF格式(一) 一.        简介 本文主要根据<中华人民共和国国家标准GB/T17798-2007--地理空间数据交换格式(Geospatialdata tra ...

  2. VMware下的Linux系统中Windows的共享目录,不支持创建软连接

    [问题]  在编译VMware下的Linux系统对从Windows中共享过来的文件,进行编译的时候,遇到:  ln: creating symbolic link XXXXXX : Operation ...

  3. Shader Model 3.0:Using Vertex Textures SM3:使用顶点纹理 (NVIDIA spec, 6800支持使用D3DFMT_R32F and D3DFMT_A32B32G32R32F的纹理格式实现Vertex Texture。)

    翻译者 周波 zhoubo22@hotmail.com 版权所有 Philipp Gerasimov Randima (Randy) Fernando Simon Green NVIDIA Corpo ...

  4. SharePoint 创建网站地图树视图及格式枚举截图

    SharePoint 创建网站地图树视图及格式枚举截图         SharePoint首页隐藏掉左側导航以后,假设要以树视图呈现站点地图也非常easy.         仅仅须要复制v4.mas ...

  5. Android开发 MMS支持 创建和编辑MMS

    Composing and editing MMS在Android Mms 应用里面的具体实现形式,或数据结构是SlideshowModel,它是一个每个节点为SlideModel的 ArrayLis ...

  6. 修改GDAL库支持IRSP6数据

    使用GDAL库发现不能打开IRSP6的数据,不过看GDAL提供的文件格式里面却是支持IRSP6的数据的,具体可以参考网页http://www.gdal.org/frmt_fast.html.下面图1是 ...

  7. 修改GDAL库支持RPC像方改正模型

    最近在做基于RPC的像方改正模型,方便对数据进行测试,修改了GDAL库中的RPC纠正模型,使之可以支持RPC像方改正参数. 下面是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一 ...

  8. Java创建柱状图及饼状图

    Java创建图表其实还是很方便的,但是要引入相关的jar包.如下 jfreechart.jar jcommon,jar gnujaxp.jar 其中最主要的是jfreechart.jar. 下面就让我 ...

  9. GDAL对TIF创建内建金字塔一个问题

    gdalwarp输出tif图像的时候,默认如果没有使用BIGTIFF=YES选项,则会根据输出影像的大小进行判断,低于4G则不适用bigtiff格式. 对于非bigtiff图像,如果这时候使用gdal ...

随机推荐

  1. 计蒜客NOIP2017提高组模拟赛(四)day1

    T1:小X的质数 小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小 X 认为,质数是一切自然数起源的地方. 在小 X 的认知里,质数是除了本身和 1 以外,没有其他因数的 ...

  2. [poj1279]Art Gallery

    题意:求多边形的核的面积. 敲一下半平面交模板........  然后我wa了一早上就因为写了%lf  不知道poj什么破机制还不能用lf的,真的想跳楼 #include<iostream> ...

  3. java continue与break区别

    在循环体中跳出循环语句有continue与break语句 continue:跳出本次循环,包括本次循环continue后面的语句, break:跳出循环体,就是说一遇到break循环就结束. 代码: ...

  4. C语言程序设计第四次作业——选择结构(二)

    (一)改错题 错误信息: 错误原因:第13行sqrt数学函数缺少")",导致编译器无法将括号正确配对 改正方法:补齐缺少的")" 错误信息: 错误原因:if语句 ...

  5. C语言程序设计预报作业

    1. 阅读邹欣老师的博客--师生关系,针对文中的几种师生关系谈谈你的看法,你期望的师生关系是什么样的? 答:万物都是变化的,师生关系也一样.小学中学把老师看作春蚕,蜡烛的的比喻到了大学显然行不通了.大 ...

  6. PTA 旅游规划(25 分)

    7-10 旅游规划(25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条 ...

  7. php+xdebug远程调试(单人)

    目录 服务器上安装 XDebug 及配置 客户端 PHPstorm 配置 浏览器安装插件 服务器上安装 XDebug 及配置 XDebug 安装 略 配置: 打开 php.ini 配置文件: vim ...

  8. struct2利用相关的Aware接口

    Struts 2提供了Aware接口.Aware为"感知"的意思,实现了相关Aware接口的Action能够感知相应的资源.Struts在实例化一个Action实例时,如果发现它实 ...

  9. web性能优化之--合理使用http缓存和localStorage做资源缓存

    一.前言 开始先扯点别的: 估计很多前端er的同学应该遇到过:在旧项目中添加新的功能模块.或者修改一些静态文件时候,当代码部署到线上之后,需求方验收OK,此时你送了一口气,当你准备开始得意于自己的ma ...

  10. 模块机制 之commonJs、node模块 、AMD、CMD

    在其他高级语言中,都有模块中这个概念,比如java的类文件,PHP有include何require机制,JS一开始就没有模块这个概念,起初,js通过<script>标签引入代码的方式显得杂 ...