zoukankan      html  css  js  c++  java
  • 在ArcEngine中创建带高程Z值的点和线图层

    管线和其附属物的坐标数据都是带有Z值的

    而且有些情况下,一个管段的两个端点的x,y值一模一样(垂直的管段)

    这样的线,在直接生成shape图层的时候,就会产生问题,特别是

    使用ArcSDE的C API直接创建到表中的时候你会发现,这样的数据是生成不了的

     

    解决的方法就是为图层添加Z值,一个图层是否带有高程值,可以在ArcMap中通过查看

    图层的属性表得知,带有Z值的图元,在Shape字段中,其类型后面会有个ZM字样

    比如point ZM,Polyline ZM

    ." alt=带高程值的图元Shape字段显示状态 src="http://hi.csdn.net/attachment/201007/21/4846_12796944235aA5.png" width=393 height=223 real_src="http://hi.csdn.net/attachment/201007/21/4846_12796944235aA5.png">

    创建带高程Z值的图层时,只设置Point的Z属性是没有用的,默认情况下

    ArcEngine会忽略Z值,

    两步走,解决问题:

    第一步:创建Shape图层,使用IFeatureWorkspace.CreateFeatureClass

    此函数的第二个参数是IFields,字段定义,在字段定义中对Shape字段的类型

    使用IGeometryDefEdit.HasZ_2 = true指定其包含Z值,

    1. IGeometryDef pGeometryDef new GeometryDef(); // 为esriFieldTypeGeometry类型的字段创建几何定义,包括类型和空间参照    
    2.                     IGeometryDefEdit pGeometryDefEdit pGeometryDef as IGeometryDefEdit;  
    3.                     pGeometryDefEdit.GeometryType_2 geometryType;  
    4.                     pGeometryDefEdit.HasZ_2 true;//图层是有高程值的   
    5.                     pGeometryDefEdit.SpatialReference_2 axmapcontrol.SpatialReference;                      
    6.                     pFieldEdit.GeometryDef_2 pGeometryDef;  
     

     

    第二步:添加图元,需要使用IZAware接口指定其ZAware为true

    1. IPoint pFromPoint new PointClass();  
    2. pFromPoint.PutCoords(fromX, fromY);                                                             
    3.                                 pFromPoint.Z formZ;  
    4.                                 IZAware fromZAware pFromPoint as IZAware;  
    5.                                 fromZAware.ZAware true 
    6.                                 //IZ iFromZ (IZ)pFromPoint;   
    7.                                 IPoint pToPoint new PointClass();  
    8.                                 pToPoint.PutCoords(toX, toY);                                  
    9.                                 pToPoint.Z toZ;  
    10.                                 IZAware toZAware pToPoint as IZAware;  
    11.                                 toZAware.ZAware true 
    12.                                 //IZ iToZ (IZ)pToPoint;   
    13.                                   
    14.                                   
    15.                                 IPolyline pPolyline new PolylineClass();  
    16.                                 IZAware iPolylineAware (IZAware)pPolyline;  
    17.                                 iPolylineAware.ZAware true 
    18.                                 pPolyline.FromPoint pFromPoint;  
    19.                                 pPolyline.ToPoint pToPoint;  
     

     

    顺便提一下ArcSDE C API中的此种问题,

    一开始我以为比较简单,使用SE_layerinfo_set_3D就能解决问题,

    但老有几条记录导入不了,使用field calculator查看一下图元的Z值才发现,

    高程都变成整数了,我可以确定传入的数据是double型的,但是调用

    SE_shape_generate_point和SE_shape_generate_line之后,生成的数据就是高程为整数

    查了查,网上有代码说使用SE_coordref_set_precision设置坐标为高精度的,

    我在创建layerinfo和插入shape的时候都进行了设置,却没有任何效果,只好暂时作罢..

     

    20100723更新:

    上面高程精度丢失问题解决了,

    本来以为很简单,直接生成shape再用ArcCatalog导入到ArcSDE中,

    用的时候发现,有几个图层死活导入不了,

    提示错误是 ORA-01426: numeric overflow ,

    于是还是得写代码直接导入,今天折腾了将近一天,想法是用C++直接调用SDE的C API来做,试试看值传入的有没有问题,

    搞到下午,折腾的差不多了的时候,突然发现这个函数SE_coordref_set_z_by_range

    使用高程的最大值最小值加0.001后传入这个函数,效果是立竿见影啊,立即搞定了,

    囧的是,为了这个问题,午饭都没吃

    来自:http://blog.sina.com.cn/s/blog_78b94aa30100ugd3.html

  • 相关阅读:
    省、市、地区三级联动
    window.open(url); 传递参数,中文乱码问题
    TortoiseSVN打分支、合并分支、切换分支
    用SoupUI导出webservice 客户端代码遇到的问题:由于 accessExternalSchema 属性设置的限制而不允许 'file' 访问, 因此无法读取方案文档 'xjc.xsd'。
    oracle 创建定时任务
    分布式服务框架原理与实践_李林锋著_笔记
    idea部署到tomcat不打印log
    idea登录github报错 Can't login: Connection reset
    idea部署web工程到tomcat_无法访问此网站问题排查
    使用myeclipse tomcat插件部署web项目时报错 an internal error occurred during add deployment . java.lang.nullpointerexception
  • 原文地址:https://www.cnblogs.com/gisoracle/p/2711296.html
Copyright © 2011-2022 走看看