C++ AO读取shapefile的属性值
C++ AO读取一个shapefile文件的所有属性值
#include "stdafx.h"
#include "iostream.h"
#include "atlbase.h"
#include "comdef.h" 字串1
#pragma warning(push)
#pragma warning(disable : 4192)
#pragma warning(disable : 4146) 字串6
#import "esriSystem.olb" \
raw_interfaces_only, \
raw_native_types, \
no_namespace, \
named_guids, \ 字串7
exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE")
#import "esriGeometry.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "esriDataSourcesFile.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "esriGeoDatabase.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
字串2
#pragma warning(pop)
字串5
//CString VariantToString1(VARIANT * va);
字串2
int main(int argc, char* argv[])
{
::CoInitialize(NULL);
字串1
IWorkspaceFactoryPtr pWSFactory(CLSID_ShapefileWorkspaceFactory);
IWorkspacePtr pWS;
// BSTR path;
// path = ::SysAllocString(L"C:\\test");
HRESULT hr = pWSFactory->OpenFromFile(CComBSTR(L"C:\\test\\bj"),0,&pWS);
if (FAILED(hr) || pWS==NULL)
{
cerr《"Failed to open the destination folder."《endl;
return 1;
} 字串1
IFeatureWorkspacePtr pFWS(pWS);
IFeatureClassPtr pFClass;
pFWS->OpenFeatureClass (CComBSTR(L"bj_est1"),&pFClass);
字串3
IFeatureCursorPtr pFCursor;
pFClass->Search (NULL,VARIANT_TRUE,&pFCursor);
字串7
long lngFieldCount ;
IFieldsPtr pFields;
IFieldPtr pField;
pFCursor->get_Fields (&pFields);
pFields->get_FieldCount (&lngFieldCount); 字串4
IFeaturePtr pFeature;
pFCursor->NextFeature (&pFeature); 字串8
USES_CONVERSION; 字串9
long t;
CComBSTR bsValues;
CComVariant varValue;
esriFieldType esriFldType;
while (pFeature)
{
bsValues = CComBSTR(L" ");
for (t =0; t < lngFieldCount ; t++)
{
pFields->get_Field(t, &pField);
pField->get_Type(&esriFldType);
switch (esriFldType)
{
case (esriFieldTypeGeometry):
bsValues += CComBSTR(L"Shape ");
break;
default:
pFeature->get_Value(t, &varValue);
if (varValue.vt != VT_BSTR)
varValue.ChangeType(VT_BSTR); 字串4
bsValues += varValue.bstrVal;
bsValues += CComBSTR(L" ");
break;
}
} 字串3
// _bstr_t outString(bsValues,FALSE); //方法1:为控制台输出作准备
// cout 《 outString《endl;
//方法2:也可以用OLE2A来进行转化,
//当然需要加上 USES_CONVERSION;
cout 《 OLE2A(bsValues)《 endl;
pFCursor->NextFeature (&pFeature);
} 字串6
pWSFactory=NULL;
pWS=NULL;
pFWS=NULL;
pFClass=NULL;
pFCursor=NULL;
pFields=NULL;
pField=NULL;
字串8
::CoUninitialize();
字串3
return 0;
} 字串5
需要注意的地方:
1、程序最开始要初始化COM库,即::CoInitialize(NULL);,这个一般可以在程序最开始的地方(确切的说只要在开始使用COM组件之前就行吧),如果是做组件我想放在构造的时候是个不错的选择 www.yztrans.com
2、既然初始化了,最后就要卸载COM库(暂且这么说吧),即::CoUninitialize();.它一般在程序的最后(程序退出之前就行)。当然不要它,似乎也能运行,但还是规范点好。这里有个问题,就是程序中用到的变量置空的问题。如果在卸载COM库之前,不将这些变量的置空(释放掉对象的引用),那么在卸载的时候会得到烦人的错误。我就被这个错误困扰了好一阵子(毕竟在VB里COM库的初始化和卸载不要我来做)。当然在一个子过程中,我想不一定需要置空(过程结束,这些变量也就撤销了),但作为一个好习惯,我想还是自己来做一下这个事免得出错.
3、在Import的时候,这些库有先后顺序。比如这里的esriGeometry.olb要放在前面,否则你会得到一个基类未定义的错误,因为这个基类是在esriGeometry.olb这个库里定义的:(
4、下面的问题全集中在字符串的处理上了。COM里用到了BSTR和VARIANT,目的COM原理的书里都有。这两种数据类型会出现在很多地方,搞清楚这两种数据类型很重要。它们的使用有一些麻烦,为了方便我们使用ATL封装的两个类CComBSTR和CComVariant.程序在最后读取属性的时候可以看到,读取的属性值的类型很多,但我们为了在Console中输出,需要做一些处理。字串4
[a]具体是:如果它是Geometry,那么就直接用"Shape"来表示,如果它是其它的类型就把它转化成BSTR,当然本身是BSTR就不用转化了。(注意里面用到的L"",When working with CComBSTR, use the text mapping L"" to declare constant OLECHAR strings. )
[b]对BSTR本身来说无法直接链接两个BSTR,要连接需要转换(如用_bstr_t类)。但CComBSTR重载了+=,真是幸福的事,呵呵。
[c]最后一步在console中输出,cout不支持BSTR,无疑又要用到转换了。方法有两个:第一是用_bstr_t类,将BSTR转换成_bstr_t类型,然后输出;第二个是使用ATL提供的宏,OLE2A,这里需要在程序中添加USES_CONVERSION; 程序中只要添加一次就行了托福答案 www.lefeng123.com
C++ AO读取shapefile的属性值的更多相关文章
- GDAL C#读取shp中文属性值乱码问题
GDAL的C#版本读取shp中,如果属性值中含有中文,读出来有可能是乱码的问题,根据SWIG生成的C#代码调试发现问题所在,在Ogr.cs文件中有这么一个函数,代码如下: internal stati ...
- C# 读取XML节点属性值
xml文件格式如下: <?xml version="1.0" encoding="UTF-8" ?> <Product type=" ...
- java中Properties类及读取properties中属性值
本文为博主原创,未经允许不得转载: 在项目的应用中,经常将一些配置放入properties文件中,在代码应用中读取properties文件,就需要专门的类Properties类,通过这个类可以进行读取 ...
- PHP中使用DOM读取解析XML属性值一例
先看XML文件结构,与常见的文件略有不同,数据并不是用闭合标签保存的,而是直接保存在属性值中. <?xml version="1.0" encoding="utf- ...
- SpringBoot 从application.yml中通过@Value读取不到属性值
package cn.exrick.xboot.mqtt; import org.eclipse.paho.client.mqttv3.*;import org.eclipse.paho.client ...
- 解决ArcGIS Engine AE 读取shapefile中文属性乱码的一条偏方
最近写一个程序,AE+C#,读shp字段属性,其中读到中文就乱码了 这个问题比较奇怪,用AE很多年了,怎么突然就乱码呢,用Arcmap打开,没乱码,证明不是数据问题 网上搜搜,很多人说是许可初始化的问 ...
- skyline开发——读取Shapefile要素属性
double len; IFeatures66 features = featureLayer.FeatureGroups.Polyline.GetCurrentFeatures(); foreach ...
- 用 AJAX 读取xml 节点属性值
<html> <head> <title>AjaxTest</title> <script> var xmlHttp; function c ...
- Spring中使用@Value读取porperties文件中的属性值方法总结及注意事项
本文为博主原创,转载请注明出处. 此前曾总结过使用工具类读取properties文件中的属性值,有兴趣的可以看一下. 如何快速获取properties中的配置属性值:https://www.cnblo ...
随机推荐
- linux mount / umount 命令的基本用法
linux mount / umount 命令的基本用法 及 开机自动挂载 格式:mount [-参数] [设备名称] [挂载点] 其中常用的参数有: -a 安装在/etc/fstab文件中类出的所有 ...
- 【转】Android源代码查看途径
原文网址:http://www.it165.net/pro/html/201501/32967.html 作为一个android coder,多阅读android源码对提高android开发水平是很有 ...
- java数组并集/交集/差集(补集)
1.说明 使用java容器类的性质选择容器 2.实现 package com.wish.datastrustudy; import java.util.HashSet; import java.uti ...
- Stm32 定时器 定时时间设置及PWM频率 占空比的设置总结
一.定时器的时钟: 当SYSCLK等于72M,APB1等于36M APB2等于72M时,定时器的时钟为72M.注意图中这句话:如果APB1/APB2预分频器=1则频率不变,否则频率x2.如果此时,AP ...
- 《SDN核心技术剖析和实战指南》3.3读书笔记
这一节主要是介绍几种开源的SDN控制器. NOX/POX.最初的NOX混合了C++和Python两种编程语言,现在演变为两个版本.NOX版本主要面向Linux平台,利用C++开发,目标是提供快速的控制 ...
- F - Truck History - poj 1789
有一个汽车公司有很多年的汽车制造历史,所以他们会有很多的车型,现在有一些历史学者来研究他们的历史,发现他们的汽车编号很有意思都是有7个小写字母组成的,而且这些小写字母具有一些特别的意义,比如说一个汽车 ...
- windows 编程—— 宽字符集 与 Unicode
目录: 从ASCII码 到 Unicode Windows 编程中的 "字符” 定义 (如何在windows下进行通用编码) 常用的通用函数,定义 (本文为学习<Programming ...
- 什么是IP地址、子网掩码、路由和网关
什么是IP地址.子网掩码.路由和网关?经常有朋友问我,的确这些术语常常被我们看到,今天就给大伙说说这几个术语的意思: 1.IP地址: IP地址有一个32位的连接地址,由4个8位字段组成,8位字段称为8 ...
- Android中自定义Activity和Dialog的位置大小背景和透明度等
1.自定义Activity显示样式 先在res/values下建colors.xml文件,写入: view plainprint? 1. <?xml version="1.0" ...
- 使用Fastjson提示No serializer found for class
在调用Json串生成方法时,提示: No serializer found for class com.jeremxy.domain.EpgDetail and no propertiesdiscov ...