关于OGR读取多边形-Polygon(GDAL 2.0版本之前)
2016-03-25 22:36
489 查看
折腾了一天,之前有个老版本的GDAL 1.5.2的,读取多边形后提取多边形外边界代码如下:
在1.5.2版本的GDAL下没什么问题,结果用了一下新的版本的(1.9.2和1.11.4的,最新的2.0没试,因为2.0的OGR整体接口都变了),首先是判定是否为多边形那里,wkbPolygon报错,然后改成了wkbPolygon25D之后可以,但是提取出来的多边形外边界的Num都是1,百思不得其解,经过一天的调试和查找资料,才发现原来是shapfile中的多边形是带空洞的,带空洞的多边形在新的GDAL版本中读取出来的都是OGRMutPolygon,也就是多边形集合,而不单单是一个多边形了,所以原来的代码就需要修改如下:
这样读出来的多边形就是正确的了。刚刚经过试验,应该是多边形集的最后一个是外边界最大的多边形,当然试验样本比较少,如果大家遇到了这个问题,可以参考一下,也可以在下面回复我。欢迎讨论。
————–2016年3月26日10:09 更新————-
为了避免版本号的问题,代码块替换如下:
因为2.0之后的版本还没有研究过,只是知道接口都变了,所以先只好return了。
OGRGeometry *pGeo=pFeature->GetGeometryRef(); OGRFeatureDefn *poFeaDfn=pFeature->GetDefnRef(); //要素的属性特征 if(poFeaDfn->GetGeomType()==wkbPolygon) //判断特征是否为多边形 { OGRPolygon *pPolygon=(OGRPolygon*)pGeo->clone(); OGRLinearRing * poLR=pPolygon->getExteriorRing(); int Num=poLR->getNumPoints(); }
在1.5.2版本的GDAL下没什么问题,结果用了一下新的版本的(1.9.2和1.11.4的,最新的2.0没试,因为2.0的OGR整体接口都变了),首先是判定是否为多边形那里,wkbPolygon报错,然后改成了wkbPolygon25D之后可以,但是提取出来的多边形外边界的Num都是1,百思不得其解,经过一天的调试和查找资料,才发现原来是shapfile中的多边形是带空洞的,带空洞的多边形在新的GDAL版本中读取出来的都是OGRMutPolygon,也就是多边形集合,而不单单是一个多边形了,所以原来的代码就需要修改如下:
OGRGeometry *pGeo=pFeature->GetGeometryRef(); OGRwkbGeometryType pGeoType=pGeo->getGeometryType(); if(pGeoType==wkbPolygon) { OGRPolygon *pPolygon=(OGRPolygon*)pGeo; } else if(pGeoType==wkbMultiPolygon) //这里就是带空洞多边形判断 { OGRMultiPolygon *pMulPolygon=(OGRMultiPolygon*)pGeo; OGRPolygon *pPolygon=NULL; for(int i=0;i<pMulPolygon->getNumGeometries();i++) { pPolygon=(OGRPolygon*)pMulPolygon->getGeometryRef(i); } }
这样读出来的多边形就是正确的了。刚刚经过试验,应该是多边形集的最后一个是外边界最大的多边形,当然试验样本比较少,如果大家遇到了这个问题,可以参考一下,也可以在下面回复我。欢迎讨论。
————–2016年3月26日10:09 更新————-
为了避免版本号的问题,代码块替换如下:
... OGRFeature *pFeature=NULL; pLayer->ResetReading(); if(GDAL_VERSION_NUM<1600) //GDAL版本小于1.6 { while((pFeature=pLayer->GetNextFeature())!=NULL) { OGRGeometry *pGeo=pFeature->GetGeometryRef(); OGRwkbGeometryType pGeoType=pGeo->getGeometryType(); if(pGeoType==wkbPolygon25D) { OGRPolygon *pPolygon=(OGRPolygon*)pGeo; } } } else(GDAL_VERSION_NUM>=1600 || GDAL_VERSION_NUM<2000) //GDAL版本大于1.6小于2.0 { while((pFeature=pLayer->GetNextFeature())!=NULL) { OGRGeometry *pGeo=pFeature->GetGeometryRef(); OGRwkbGeometryType pGeoType=pGeo->getGeometryType(); if(pGeoType==wkbPolygon) { OGRPolygon *pPolygon=(OGRPolygon*)pGeo; } else if(pGeoType==wkbMultiPolygon) { OGRMultiPolygon *pMulPolygon=(OGRMultiPolygon*)pGeo; OGRPolygon *pPolygon=NULL; for(int i=0;i<pMulPolygon->getNumGeometries();i++) { pPolygon=(OGRPolygon*)pMulPolygon->getGeometryRef(i); } } } } else { return; } ...
因为2.0之后的版本还没有研究过,只是知道接口都变了,所以先只好return了。
相关文章推荐
- 【开源GIS系列】Geoserver扩展GDAL插件
- 【C/C++】超大遥感影像读取和存储 GDAL 转 http://zhan.renren.com/chinalee?gid=3602888497997597705&checked=true
- Opencv 绘图函数
- GADL/OGR C# 读取Dxf数据时,Feature的Layer属性中文乱码问题的解决
- vs2010+GDAL安装配置
- DrawPolygon
- google map上实现通过点击地图任意点进行标记并形成多边形
- windows环境下JAVA+GDAL配置
- vs2010编译和配置/调用gdal
- VS2012编译和调用gdal
- Python之GDAL配置
- vs2010+GDAL安装配置
- Qt之鼠标随手画及画多边形
- GDAL 对shp的增删查改
- GDAL 64位编译
- 关于GCJ02和WGS84坐标系对比
- GDAL/OGR 1.9.0获取shp文件中中文字段值和属性值乱码文件解决
- GDAL C# “OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常 解决方法
- 使用GDAL下载并转换SRTM的DEM数据(一)
- 使用GDAL下载并转换SRTM的DEM数据(二)