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的属性值的更多相关文章

  1. GDAL C#读取shp中文属性值乱码问题

    GDAL的C#版本读取shp中,如果属性值中含有中文,读出来有可能是乱码的问题,根据SWIG生成的C#代码调试发现问题所在,在Ogr.cs文件中有这么一个函数,代码如下: internal stati ...

  2. C# 读取XML节点属性值

    xml文件格式如下: <?xml version="1.0" encoding="UTF-8" ?> <Product type=" ...

  3. java中Properties类及读取properties中属性值

    本文为博主原创,未经允许不得转载: 在项目的应用中,经常将一些配置放入properties文件中,在代码应用中读取properties文件,就需要专门的类Properties类,通过这个类可以进行读取 ...

  4. PHP中使用DOM读取解析XML属性值一例

    先看XML文件结构,与常见的文件略有不同,数据并不是用闭合标签保存的,而是直接保存在属性值中. <?xml version="1.0" encoding="utf- ...

  5. SpringBoot 从application.yml中通过@Value读取不到属性值

    package cn.exrick.xboot.mqtt; import org.eclipse.paho.client.mqttv3.*;import org.eclipse.paho.client ...

  6. 解决ArcGIS Engine AE 读取shapefile中文属性乱码的一条偏方

    最近写一个程序,AE+C#,读shp字段属性,其中读到中文就乱码了 这个问题比较奇怪,用AE很多年了,怎么突然就乱码呢,用Arcmap打开,没乱码,证明不是数据问题 网上搜搜,很多人说是许可初始化的问 ...

  7. skyline开发——读取Shapefile要素属性

    double len; IFeatures66 features = featureLayer.FeatureGroups.Polyline.GetCurrentFeatures(); foreach ...

  8. 用 AJAX 读取xml 节点属性值

    <html> <head> <title>AjaxTest</title> <script> var xmlHttp; function c ...

  9. Spring中使用@Value读取porperties文件中的属性值方法总结及注意事项

    本文为博主原创,转载请注明出处. 此前曾总结过使用工具类读取properties文件中的属性值,有兴趣的可以看一下. 如何快速获取properties中的配置属性值:https://www.cnblo ...

随机推荐

  1. POJ2251 Dungeon Master(bfs)

    题目链接. 题目大意: 三维迷宫,搜索从s到e的最小步骤数. 分析: #include <iostream> #include <cstdio> #include <cs ...

  2. 【贪心+堆】XMU 1584 小明的烦恼

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1584 题目大意: 给n(n<=100 000)个任务的耗时和截至时间,问最少不能 ...

  3. 进程间通讯aidl

    进程间通讯(aidl) 1.首先定义一个接口 2.把这个接口的文件扩展名改为xxx.aidl 3.写一个MyService类继承自Service类重新里面的方法, 4.在MyService类定义一个内 ...

  4. UINavigationController 导航控制器 ,根据文档写的一些东西

    今天讲了导航控制器UINavigationController 和标签栏视图控制器UITabBarController 先来说一说导航视图控制器  UINavigationController 导航控 ...

  5. php编译错误Note that the MySQL client library is not bundled anymore或者cannot find mysql header file

    rpm -ivh MySQL-devel-community-5.1.57-1.sles10.x86_64.rpm export PATH=/usr/local/services/libxml2-2. ...

  6. 开源消息中间件DotNetMQ

    由于这个开源项目对我这种中间件菜鸟很有帮助,因此,我将官方的说明文档翻译如下: Introduction In this article, I will introduce a new and ind ...

  7. 大数据笔记06:大数据之Hadoop的HDFS(文件的读写操作)

    1. 首先我们看一看文件读取: (1)客户端(java程序.命令行等等)向NameNode发送文件读取请求,请求中包含文件名和文件路径,让NameNode查询元数据. (2)接着,NameNode返回 ...

  8. Chapter 4. Using the Gradle Command-Line 使用gradle命令行

    This chapter introduces the basics of the Gradle command-line. You run a build using the gradle comm ...

  9. 在top命令下kill和renice进程

    For common process management tasks, top is so great because it gives an overview of the most active ...

  10. .bash_profile和.bashrc的区别

    参考资料: http://blog.163.com/wang_hai_fei/blog/static/309020312008728333912/