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_description = VertexDescriptionDesignerImpl.getDefaultDescriptor2D();),

      其他類都自定義m_impl存儲數據中也都會有類似語句 )

  而    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()); //讀取維度/類型

 

   坐標轉換(二維仿射變換):

     Transformation2D transformation = new Transformation2D();
     geomPoint.applyTransformation( transformation );

  

  其他操作:
  
  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM