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. 第2个Wiindows程序讲解

    上次,我们一起写了一个Windows窗口程序,这个窗口程序虽然非常简单,但是,代码仍然很多,相信,一定会有很多初学者看见这些代码而感到头疼.不用怕,现在,我们就一起来分析一下这些代码,相信通过我们共同 ...

  2. 开源项目AndroidUtil-采用Fragment实现TabHost

    原文出自:方杰|http://fangjie.info/?p=141 转载请注明出处 学习Android也有一段时间了,感觉大部分的Android应用都有很多类似的组件,所以就打算做了这样一个开源项目 ...

  3. spring配置文件中id与name

    1.id属性命名必须满足XML的命名规范,因为id其实是XML中就做了限定的. 2.name属性则没有这些限定,你可以使用几乎任何的名称 3.配置文件中不允许出现两个id相同的<bean> ...

  4. 在DataTable和DataView中查找指定记录

    一.在DataTable中查找 1. 使用Select方法查找没有主键的表DataTable的Select方法返回一个DataRow数组,有四个重载的函数. DataRow[] drs = dt.Se ...

  5. xml中不能直接添加ViewGroup

    我知道可以直接添加一个<View />的,今天想添加个容器类,然后后台动态添加SurfaceView到ViewGroup容器里,不过提示inflate报错了.难道ViewGroup不能直接 ...

  6. Android Studio中解决Gradle DSL method not found: &#39;android()&#39;

    近期导入as的项目出了这种问题 这个问题困扰了我非常长时间,好吧,搜了半天全都是runProguard的.最后在stackoverflow上搜到解决的方法了: http://stackoverflow ...

  7. UIKit和Core Graphics绘图(一)——字符串,线条,矩形,渐变

    概述 CoreGraphics也称为Quartz 2D 是UIKit下的主要绘图系统,频繁的用于绘制自定义视图.Core Graphics是高度集成于UIView和其他UIKit部分的.Core Gr ...

  8. 【iOS解决思路】得到某个view所在的ViewController

    在一个tableViewCell中有个btn,如何得到它所在的viewcontroller,以便于push出新的viewController? 我的思路是传值,但网上有下面这种方法,分享. 跟得到某个 ...

  9. php parse_url 函数使用方法解析

    此函数返回一个关联数组,包含现有 URL 的各种组成部分.如果缺少了其中的某一个,则不会为这个组成部分创建数组项.组成部分为: scheme – 如 http host port pass path ...

  10. css中的垂直居中方法

    单行文字 (外行高度固定) line-height 行高, 将line-height值与外部标签盒子的高度值设置成一致就可以了. height:3em; line-height:3em; 多行文字 图 ...