Esri geometry api java 学习文档 (2) 几何图形 (Geometry)与数据结构

Geometry是Esri geometry api中所有类的父类,它定义了所有几何数据的存储结构 与 基本方法。

无论派生出的任何点、线、面等要素都要遵循Geometry定下的基本规则,那我们就来看一下Geometry到底使用了什么思路?搭建了什么样的结构?

上图是Esri Geometry的子类们,与下图OGC 对Geometry 的定义相对比,Esri 使用顶点Vertex(并非是Point)来构建多点的要素,先将“多点要素”、“域”、“线” 和 “单点要素”分开,再构成其他要素。

Geometry一般包含的数据:

  在Esri Geometry中每个几何实体都包含着:

  VertexDescription m_description;//属性描述
  volatile int m_touchFlag;//改动次数

  其中VertexDescription用于存储各顶点的属性数据

  而    m_touchFlag    则负责监视几何实体的改动操作

Geometry一般规定的操作:

  在Esri Geometry中每个几何实体都可以:

  对属性的操作(用的不多可跳过):

  addAttribute(int semantics)  加入属性

    派生函数:addID() addM()

  hasAttribute(int semantics)  查询属性

    派生函数:hasID() hasM() hasZ()

  dropAllAttributes()  删除所有附加属性(除了xy)

  dropAttribute(int semantics)  删除某个属性

  属性操作代码:

 1         geomPoint.addAttribute(0);//无效,因为x是固有属性
 2         geomPoint.addAttribute(1);//无效,因为y是固有属性
 3
 4         geomPoint.addAttribute(2);//添加M属性
 5         geomPoint.addM();//等同于geomPoint.addAttribute(2);
 6         geomPoint.addAttribute(3);//添加ID属性
 7         geomPoint.addID();//等同于geomPoint.addAttribute(3);
 8
 9         System.out.println(geomPoint.hasAttribute(3));//检查是否有ID属性true
10
11         geomPoint.dropAttribute(3);//删除ID属性
12         System.out.println(geomPoint.hasAttribute(3));//检查是否有ID属性false
13
14         geomPoint.dropAllAttributes();//删除所有属性(XY固有属性除外)
15         System.out.println(geomPoint.hasAttribute(2));//检查是否有M属性false
16         System.out.println(geomPoint.hasAttribute(0));//检查是否有X属性true 固有属性不可删除

  几何实体的几何判断*:

  

  calculateLength2D()  计算长度  点:0  线:总线长  面:总线长

  calculateArea2D()   计算面积  点:0  线:0     面:总面积

  getBoundary()       得到边界  点:无  线:端点  面:所有边缘线(不分内外)

  queryEnvelope(Envelope env)  得到外接矩形域

  vertex_count(Geometry geom)  计算顶点个数

  getDimension()    读取维度

  getType()      读取类型

  几何实体的几何判断代码:

         System.out.println(geomPoint.calculateLength2D());
         System.out.println(geomLine.calculateLength2D());
         System.out.println(geomPolygon.calculateLength2D());
         //计算长度

         System.out.println(geomPoint.calculateArea2D());                  System.out.println(geomLine.calculateArea2D());
         System.out.println(geomPolygon.calculateArea2D());
         //计算面积

         Geometry geomTemp = geomPoint.getBoundary();
         geomTemp = geomLine.getBoundary();
         geomTemp = geomPolygon.getBoundary();
         //得到边界

         Envelope env1 = new Envelope();
         geomPoint.queryEnvelope(env1);
         System.out.println(env1.toString());

         geomLine.queryEnvelope(env1);
         System.out.println(env1.toString());

         geomPolygon.queryEnvelope(env1);
         System.out.println(env1.toString());
         //得到外接矩形

         System.out.println(Geometry.vertex_count(geomPoint));
         System.out.println(Geometry.vertex_count(geomLine));
         System.out.println(Geometry.vertex_count(geomPolygon));
         //计算顶点个数

         System.out.println(geomPoint.getDimension());
         System.out.println(geomPoint.getType());

         System.out.println(geomLine.getDimension());
         System.out.println(geomLine.getType());

         System.out.println(geomPolygon.getDimension());
         System.out.println(geomPolygon.getType());
         //读取维度/类型    

  其他操作:
  
  copyTo(Geometry dst)  复制到另一个

  createInstance()  新建一个同类型的空集

  copy()  复制一个新的( = copyTo + createInstance)

  estimateMemorySize()  估计内存

  setEmpty()  置空
  isEmpty()    判断为空

  toString()  输出string便于debug

  其他操作代码:

        wktString = "MULTIPOINT ((-106.4453583 41.11775),(-106.4453583 42.11775))";
        Geometry geomMulitPoint2 = OperatorImportFromWkt.local().execute(WktImportFlags.wktImportDefaults, Geometry.Type.MultiPoint, wktString, null);

        geomMulitPoint.copyTo(geomMulitPoint2);
        System.out.println(geomMulitPoint.toString());
        System.out.println(geomMulitPoint2.toString());

        System.out.println(geomMulitPoint.isEmpty());
        geomMulitPoint.setEmpty();
        System.out.println(geomMulitPoint.isEmpty());
        System.out.println(geomPoint.estimateMemorySize());
  

全部代码大家可以copy下来尝试:

  1 package learn;
  2
  3 import java.io.IOException;
  4
  5 import org.codehaus.jackson.JsonParseException;
  6
  7 import com.esri.core.geometry.Geometry;
  8 import com.esri.core.geometry.OperatorImportFromWkt;
  9 import com.esri.core.geometry.Envelope;
 10 import com.esri.core.geometry.WktImportFlags;
 11
 12 public class GeometryLearn {
 13
 14     public static void main(String args[]) throws IOException
 15     {
 16         createFromWKT();
 17     }
 18
 19     static void createFromWKT() throws JsonParseException, IOException {
 20
 21
 22         String wktString = "Point (-106.4453583 41.11775)";
 23         Geometry geomPoint = OperatorImportFromWkt.local().execute(WktImportFlags.wktImportDefaults, Geometry.Type.Point, wktString, null);
 24
 25         wktString = "MULTIPOINT ((-106.4453583 39.11775),(-106.4453583 40.11775))";
 26         Geometry geomMulitPoint = OperatorImportFromWkt.local().execute(WktImportFlags.wktImportDefaults, Geometry.Type.MultiPoint, wktString, null);
 27
 28         wktString = "MULTILINESTRING ((6.9 9.1,7 8.8),(6.8 8.8,7 9,7.2 8.9,7.4 9),(7.4 8.9,7.25 8.6,7.15 8.8))";
 29         Geometry geomLine = OperatorImportFromWkt.local().execute(WktImportFlags.wktImportDefaults, Geometry.Type.Polyline, wktString, null);
 30
 31         wktString = "MULTIPOLYGON (((0.1 0.7, 0.1 0.4, 0.3 0.4, 0.3 0.7, 0.1 0.7)),"
 32                 + "((0 0, 0.5 0, 1 0.5, 0.5 1, 0 1, -0.5 0.5, 0 0),"
 33                 + "(0.5 0.2, 0.2 0.3, 0.1 0.2, -0.2 0.5, 0.2 0.9, 0.6 0.5, 0.5 0.2)))";
 34         Geometry geomPolygon = OperatorImportFromWkt.local().execute(WktImportFlags.wktImportDefaults, Geometry.Type.Polygon, wktString, null);
 35
 36         geomPoint.addAttribute(0);
 37         geomPoint.addAttribute(1);
 38         geomPoint.addAttribute(2);
 39         geomPoint.addM();
 40         geomPoint.addAttribute(3);
 41         geomPoint.addID();
 42
 43         System.out.println(geomPoint.hasAttribute(3));
 44
 45         geomPoint.dropAttribute(3);
 46         System.out.println(geomPoint.hasAttribute(3));
 47
 48         geomPoint.dropAllAttributes();
 49         System.out.println(geomPoint.hasAttribute(2));
 50         System.out.println(geomPoint.hasAttribute(0));
 51
 52
 53 //        Geometry geomMulitPoint2 = geomMulitPoint.copy();
 54 //        System.out.println(geomMulitPoint2.toString());
 55 //
 56 //        geomMulitPoint2.assignVertexDescription(geomMulitPoint.getDescription());
 57 //        System.out.println(geomMulitPoint2.toString());
 58 //
 59 //        geomMulitPoint2.mergeVertexDescription(geomMulitPoint.getDescription());
 60 //        System.out.println(geomMulitPoint2.toString());
 61
 62
 63         System.out.println(geomPoint.calculateLength2D());
 64         System.out.println(geomLine.calculateLength2D());
 65         System.out.println(geomPolygon.calculateLength2D());
 66
 67         System.out.println(geomPoint.calculateArea2D());
 68         System.out.println(geomLine.calculateArea2D());
 69         System.out.println(geomPolygon.calculateArea2D());
 70
 71
 72         Geometry geomTemp = geomPoint.getBoundary();
 73         geomTemp = geomLine.getBoundary();
 74         geomTemp = geomPolygon.getBoundary();
 75
 76         Envelope env1 = new Envelope();
 77         geomPoint.queryEnvelope(env1);
 78         System.out.println(env1.toString());
 79
 80         geomLine.queryEnvelope(env1);
 81         System.out.println(env1.toString());
 82
 83         geomPolygon.queryEnvelope(env1);
 84         System.out.println(env1.toString());
 85
 86
 87         System.out.println(Geometry.vertex_count(geomPoint));
 88         System.out.println(Geometry.vertex_count(geomLine));
 89         System.out.println(Geometry.vertex_count(geomPolygon));
 90
 91         System.out.println(geomPoint.getDimension());
 92         System.out.println(geomPoint.getType());
 93
 94         System.out.println(geomLine.getDimension());
 95         System.out.println(geomLine.getType());
 96
 97         System.out.println(geomPolygon.getDimension());
 98         System.out.println(geomPolygon.getType());
 99
100         wktString = "MULTIPOINT ((-106.4453583 41.11775),(-106.4453583 42.11775))";
101         Geometry geomMulitPoint2 = OperatorImportFromWkt.local().execute(WktImportFlags.wktImportDefaults, Geometry.Type.MultiPoint, wktString, null);
102
103         geomMulitPoint.copyTo(geomMulitPoint2);
104         System.out.println(geomMulitPoint.toString());
105         System.out.println(geomMulitPoint2.toString());
106
107         System.out.println(geomMulitPoint.isEmpty());
108         geomMulitPoint.setEmpty();
109         System.out.println(geomMulitPoint.isEmpty());
110         System.out.println(geomPoint.estimateMemorySize());
111
112     }
113 }

参考:

http://esri.github.io/geometry-api-java/javadoc/com/esri/core/geometry/Geometry.html

https://github.com/Esri/geometry-api-java/wiki

原文地址:https://www.cnblogs.com/17th-trackwalker/p/10338957.html

时间: 2024-11-13 06:57:50

Esri geometry api java 学习文档 (2) 几何图形 (Geometry)与数据结构的相关文章

Esri geometry api java 学习文档 (3) 线、多线 (Polyline)

线要素是是一个1维的空间数据,每个线要素一组单线(paths),每条单线包含着一组点(n≥2). 这里与OGC.JTS不同的是,Esri更喜欢用一个Polyline表示多线元素,单线 = 只有一个元素的多线,而不喜欢把Line和MultiLine单独分开. 线要素由一组点要素组成,这些点要素被分为三类: Boundary: 边界点 Interior: 内部点 Exterior: 外部点 如图: 边界点就是 线要素的开始点和结束点; 内部点就是 线要素上非开始点和结束点的其他点; 外部点就是 非内

ORACLE官网JAVA学习文档

Trails Covering the Basics 1 Getting Started 1.1 The Java Technology Phenomenon 1.1.1 About the Java Technology The Java Programming Language ?? Figure 1 an overview of the software development process java文件以.java作为后缀 源文件被javac compiler编译为.class 文件

java8 JDK1.8 API 中文 翻译版 java帮助文档

来源 http://blog.csdn.net/qw599186875/article/details/52265995?ticket=ST-213719-sl0mP1mtz9GcbY44tTbE-passport.csdn.net java 1.6 帮助文档 中文 链接:http://download.csdn.net/detail/qw599186875/9608735 英文 Java1.8 帮助文档 英文 中文 – 谷歌版 在线版: https://blog.fondme.cn/apido

Openstack python api 学习文档

Openstack python api 学习文档 转载请注明http://www.cnblogs.com/juandx/p/4953191.html 因为需要学习使用api接口调用openstack,所以上一篇写了一些使用openstack的纯api调用的方法, 但是openstack还提供了更好的python的api,只需要python的包即可,感觉更好使用. 对于compute的api,包是放在了/usr/lib/python2.7/site-packages/novaclient/目录,

Activit最入门学习文档,从如何创建项目开始共20章,看完,任何Java项目集成无压力

Activit流程引擎 本人水平,刚自学java一个多月,然后看视频做的笔记,全部傻瓜式截图教程,反正我学习之前没在网上搜索到任何小白教程, Activit官方的教程真心看不懂,因为都是文字 没具体创建步奏,所以对新手来说很无奈, 然后吧,就把自己的学习经验贡献出来啦 最小白的文档,看完之后,集成到任何java项目中都无压力,我最后的是做了个Jfinal集成,估计这是网上搜到最全的容易懂的入门学习文档,本人自学java一个月,反正我看官方例子什么的都看不懂,然后各搜素也没收到教程视频,还好有别人

优于 swagger 的 java markdown 文档生成框架-01-入门使用

设计初衷 节约时间 Java 文档一直是一个大问题. 很多项目不写文档,即使写文档,对于开发人员来说也是非常痛苦的. 不写文档的缺点自不用多少,手动写文档的缺点也显而易见: 非常浪费时间,而且会出错. 无法保证及时更新.代码已经变了,但是文档还要同步修改.需要强制人来维护这一种一致性.这很难. 为什么不是 swagger-ui java 的文档有几类: jdk 自带的 doc 生成.这个以前实践给别人用过,别人用 C#,看到 java 的默认文档感觉很痛苦. 就算是我们 java 开发者,也很讨

Mybatis学习文档

Mybatis学习文档 Mybatis是持久层框架类似于Hibernate的orm持久层框架 1.JDBC访问数据库存在的问题 频繁创建和打开.关闭数据链接,太消耗资源 Sql语句存在硬编码,不利于维护 Sql参数设置硬编码,不利于维护 结果集获取与遍历复杂,存在硬编码,不利于维护,期望查询后返回一个java对象 2.Mybatis介绍 前身是apache下的开源项目,2010有aspache software foundation 迁移到了google code ,并且改名为Mybatis,2

JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载

JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet和应用程序的程序开发环境.它由一个处于操作系统层之上的运行环境还有开发者编译,调试和运行用Java语言写的applet和应用程序所需的工具组成. JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品.自从Java推出以来,JDK已经成为使用最广泛

solr学习文档之高亮

在<solr学习文档之添加分词词库>一文中,我们学习了如何对一个词组进行分词提取,这一章我们将会使用到分词词库,并介绍如何进行高亮展现 在此之前,我们先了解一下高亮的几个参数 hl:是否开启高亮组件,true为开启,false为不开启 hl.fl:需要开启的高亮字段,多个可用逗号隔开 hl.simple.pre:高亮字段前缀 hl.simple.post:高亮字段后缀 (其他的暂不介绍,想知道的可自行百度) 想要进行高亮站下,需要在schema.xml中将你的字段名(如topicContent