新版GDAL 读取shape文件读取失败和乱码

85 篇文章 4 订阅

项目问题,遇到了一个shp文件读取乱码,于是自己写代码调试,踩坑不少,特此记录过程,供大家参考。

于是找到网上的代码GDAL之OGR入门

#include "ogrsf_frmts.h" 

int main()
{
    OGRRegisterAll();
    OGRDataSource       *poDS;
    poDS = OGRSFDriverRegistrar::Open( "point.shp", FALSE );
    if( poDS == NULL )
    {
        printf( "Open failed.\n%s" );
        exit( 1 );
    }
    OGRLayer *poLayer;
    poLayer = poDS->GetLayerByName( "point" );
    OGRFeature *poFeature;
    poLayer->ResetReading();
    while( (poFeature = poLayer->GetNextFeature()) != NULL )
    {
        OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
        int iField;
        for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ )
        {
            OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn( iField );
            if( poFieldDefn->GetType() == OFTInteger )
                printf( "%d,", poFeature->GetFieldAsInteger( iField ) );
            else if( poFieldDefn->GetType() == OFTReal )
                printf( "%.3f,", poFeature->GetFieldAsDouble(iField) );
            else if( poFieldDefn->GetType() == OFTString )
                printf( "%s,", poFeature->GetFieldAsString(iField) );
            else
                printf( "%s,", poFeature->GetFieldAsString(iField) );
        }
        OGRGeometry *poGeometry;
        poGeometry = poFeature->GetGeometryRef();
        if( poGeometry != NULL 
            && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint )
        {
            OGRPoint *poPoint = (OGRPoint *) poGeometry;
            printf( "%.3f,%3.f\n", poPoint->getX(), poPoint->getY() );
        }
        else
        {
            printf( "no point geometry\n" );
        }       
        OGRFeature::DestroyFeature( poFeature );
    }
    OGRDataSource::DestroyDataSource( poDS );
} 

然而vs提示没有成员Open函数,想必是GDAL更新了接口,于是继续寻找,总算找到了这篇GDAL2.x与1.x的主要变化比较(以C++为例说明),这才发现了新接口的使用办法,于是更改代码:

	OGRRegisterAll();
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");   //设置支持中文路径
	CPLSetConfigOption("SHAPE_ENCODING", "");			// 属性表字段支持中文

	GDALDataset *poDS = (GDALDataset*) GDALOpenEx(stSrcPath.c_str(), GDAL_OF_VECTOR, NULL, NULL, NULL );

	if( poDS == NULL )
	{
		printf( "Open failed.\n" );
		exit( 1 );
	}

	OGRLayer  *poLayer = poDS->GetLayerByName( "points" );
	OGRFeature *poFeature;
	poLayer->ResetReading();
	while( (poFeature = poLayer->GetNextFeature()) != NULL )
	{
		OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
		int iField;
		for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ )
		{
			OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn( iField );
			if( poFieldDefn->GetType() == OFTInteger )
				printf( "%d,", poFeature->GetFieldAsInteger( iField ) );
			else if( poFieldDefn->GetType() == OFTReal )
				printf( "%.3f,", poFeature->GetFieldAsDouble(iField) );
			else if( poFieldDefn->GetType() == OFTString )
				AddItemToList(poFeature->GetFieldAsString(iField));
			else
				AddItemToList(poFeature->GetFieldAsString(iField));
		}
		OGRGeometry *poGeometry;
		poGeometry = poFeature->GetGeometryRef();
		if( poGeometry != NULL 
			&& wkbFlatten(poGeometry->getGeometryType()) == wkbPoint )
		{
			OGRPoint *poPoint = (OGRPoint *) poGeometry;
			printf( "%.3f,%3.f\n", poPoint->getX(), poPoint->getY() );
		}
		else
		{
			printf( "no point geometry\n" );
		}

		OGRFeature::DestroyFeature( poFeature );
	}

	//关闭数据
	GDALClose( poDS );

特别注意设置以下两点,否则会出现shp文件无法打开,或者打开后字段乱码的问题:

	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");   //设置支持中文路径
	CPLSetConfigOption("SHAPE_ENCODING", "");			// 属性表字段支持中文

希望能够帮助到有需要的人。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值