最近在使用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. [HZOI 2016]公路修建

    [题目描述] OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织成立了,旨 ...

  2. jquery 中toggle的2种用法

    一.在元素的click事件中绑定两个或两个以上的函数  toggle不像bind需要在后面添加"click"来绑定click触发事件,toggle本身就是click触发的(而且只能 ...

  3. 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程

    视频中的物体识别 摘要 物体识别(Object Recognition)在计算机视觉领域里指的是在一张图像或一组视频序列中找到给定的物体.本文主要是利用谷歌开源TensorFlow Object De ...

  4. MFC程序设计小结

    由于毕业设计要用到MFC,因此本人这段时间开始学习MFC编程,边学边做,现将一些重要的知识点总结如下: 创建一个MFC程序,操作步骤很简单,要点就是选择MFC AppWizard(exe).单文档或者 ...

  5. 华科机考:N阶楼梯上楼

    时间限制:1秒空间限制:32768K 题目描述 N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入描述: 输入包括一个整数N,(1<=N<90). 输出描 ...

  6. Python中tuple的功能介绍

    Tuple的功能介绍 1. 元祖的两种方法 1. 元祖的内置方法 两个元祖的相加 格式:x.__add__(y)等同于x+y 例如:tu1 = (1,2,3,) print(tu1.__add__(( ...

  7. JS 中判断空值 undefined 和 null

    1.JS 中如何判断 undefined JavaScript 中有两个特殊数据类型:undefined 和 null,下节介绍了 null 的判断,下面谈谈 undefined 的判断. 以下是不正 ...

  8. requestAnimationFrame之缓动的应用

    之前需要使用的定时器的时,立马想到的是setInterval(),用着用着就成为习惯,并没有遇到什么不妥之处.习惯性的操作往往容易让一个人拒绝尝试一些其他的方法.现在的方法用得好好的,没事干啥找其他法 ...

  9. Jenkins执行批处理文件、powershell失败

    今天搭建Jenkins持续集成环境,编译环境是.net core.整理了一些发布的命令配置在Jenkins,问题来了,使用powershell插件运行dotnet restore.dotnet bui ...

  10. Android POJO 转换器 —> RapidOOO

    博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml 原文链接:https://blog.wang ...