欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java 操作gis geometry類型數(shù)據(jù)方式

 更新時間:2022年03月11日 14:28:10   作者:TNT_D  
這篇文章主要介紹了java 操作gis geometry類型數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

java操作gis geometry類型數(shù)據(jù)

現(xiàn)在做的gis方面的業(yè)務,所以需要操作postgis中的geometry對象,找了很多的庫,比如geotools,但是莫名下載不下來。

還有就是jts,但是不好用,操作起來很復雜。找到了一個其他的類庫--geolatte-geom 和geolatte-geojson。

用于操作geometry和String以及json的互相轉化。而json和geojson個人理解就是輸出格式不同。多了一些geometry特有的屬性。

主要用于將String轉geometry對象、wkt和wkb方便好用。

pom.xml文件如下

<!-- https://mvnrepository.com/artifact/org.geolatte/geolatte-geom -->
<dependency>
?? ?<groupId>org.geolatte</groupId>
?? ?<artifactId>geolatte-geom</artifactId>
?? ?<version>1.6.0</version>
</dependency>
?
<!-- https://mvnrepository.com/artifact/org.geolatte/geolatte-geojson -->
<dependency>
?? ?<groupId>org.geolatte</groupId>
?? ?<artifactId>geolatte-geojson</artifactId>
?? ?<version>1.6.0</version>
</dependency>
public static void main(String[] args) {
? ? ? ? // 模擬數(shù)據(jù)庫中直接取出的geometry對象值(他是二進制的)
? ? ? ? // WKT 是字符串形式,類似"POINT(1 2)"的形式
? ? ? ? // 所以WKT轉 ?geometry,相當于是字符串轉geometry
? ? ? ? // WKB轉 ?geometry,相當于是字節(jié)轉geometry
? ? ? ? String s="01020000800200000097E5880801845C404D064F3AF4AE36400000000000000000290A915F01845C40DC90B1A051AE36400000000000000000";
? ? ? ? Geometry geo = Wkb.fromWkb(ByteBuffer.from(s));
?
? ? ? ? // geometry對象和WKT輸出一致
// ? ? ? ?Geometry geometry1 = Wkt.fromWkt(wkt);
? ? ? ? System.out.println("-----Geometry------"+geo.getPositionN(1));
? ? ? ? System.out.println("-----wkt------"+ Wkt.toWkt(geo));
? ? ? ? System.out.println("-----wkb------"+Wkb.toWkb(geo));
? ? }

java讀取數(shù)據(jù)庫geometry

最近因為需要存一些經(jīng)緯度塊信息到數(shù)據(jù)庫,所以用到了mysql中的Geometry屬性(幾何對象)。在網(wǎng)上搜集了很多資料,到真正用的時候還是各種問題,所以下面推薦一種可能有點笨但是實用的方法(我的使用環(huán)境springboot工具是sts),下面就舉個例子來說明一下。

操作

先了解一下數(shù)據(jù)庫中空間數(shù)據(jù)類型有哪些

類型說明簡介例子
Geometry間數(shù)據(jù)任意一種空間類型 
Point坐標值POINT(104.00924 30.46872)
LineString線,由一系列點連接而成LINESTRING(1 1, 1 1, 1 1)
Polygon多邊形由多條線組成POLYGON((1 1, 2 2, 3 3, 4 4, 5 5))
MultiPoint點集合集合類,包含多個點MULTIPOINT(1 1, 2 2, 1 1)
MultiLineString線集合集合類,包含多條線MULTILINESTRING((1 1, 2 2), (1 1, 1 1))
MultiPolygon多邊形集合集合類,包含多個多邊形MULTIPOLYGON(((0 0, 1 0, 1 1, 0 1, 0 0)), ((1 1, 1 1, 1 1, 1 1, 1 1)))
GeometryCollection空間數(shù)據(jù)集合集合類,可以包括多個點、線、多邊形GEOMETRYCOLLECTION(POINT(1 1), POINT(3 3), LINESTRING(1 1, 2 2))

接著往數(shù)據(jù)庫插入一個測試數(shù)據(jù),插入的是一個空間數(shù)據(jù)集合里面包含多個多邊形集合。

INSERT INTO `geometry`(`geome`) VALUES(GeomFromText('GEOMETRYCOLLECTION(MULTIPOLYGON(((104.009241 30.468972,104.009229 30.468961,104.009225 30.468997)),((104.009241 30.468972,104.009229 30.468961,104.009225 30.468997))),MULTIPOLYGON(((104.009241 30.468972,104.009229 30.468961,104.009225 30.468997))))'));

數(shù)據(jù)準備好了就準備開始準備讀取操作。

在pom.xml添加操作Geometry等對象的依賴。

<dependency>
? ? <groupId>com.vividsolutions</groupId>
? ? <artifactId>jts</artifactId>
? ? <version>1.13</version>
</dependency>

本來先是想直接在實體類確定類型直接轉對象,但是用了后發(fā)現(xiàn)不行,所以我就直接設置成Object,在mysql中存儲Geometry使用的是二進制,所以下面直接把二進制通過jts轉成Geometry對象。

//private Geometry geom; 不可行
private Object geomAsBytes; //可行 ?最終得到的是一個byte數(shù)組
?? ? //直接把數(shù)據(jù)庫中的byte[]轉Geometry對象
? public static Geometry getGeometryByBytes( byte[] ?geometryAsBytes) throws Exception {
? ? ? ? ? ?Geometry dbGeometry = null;
? ? ? ? ? ? ? ?// 字節(jié)數(shù)組小于5,說明geometry有問題
? ? ? ? ? ? ? ?if (geometryAsBytes.length < 5) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return null;
? ? ? ? ? ? ? ?}
?
? ? ? ? ? ? ? ?//這里是取字節(jié)數(shù)組的前4個來解析srid
? ? ? ? ? ? ? ?byte[] sridBytes = new byte[4];
? ? ? ? ? ? ? ?System.arraycopy(geometryAsBytes, 0, sridBytes, 0, 4);
? ? ? ? ? ? ? ?boolean bigEndian = (geometryAsBytes[4] == 0x00);
? ? ? ? ? ? ? ?// 解析srid
? ? ? ? ? ? ? ?int srid = 0;
? ? ? ? ? ? ? ?if (bigEndian) {
? ? ? ? ? ? ? ? ? ?for (int i = 0; i < sridBytes.length; i++) {
? ? ? ? ? ? ? ? ? ? ? ?srid = (srid << 8) + (sridBytes[i] & 0xff);
? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?} else {
? ? ? ? ? ? ? ? ? ?for (int i = 0; i < sridBytes.length; i++) {
? ? ? ? ? ? ? ? ? ? ? ?srid += (sridBytes[i] & 0xff) << (8 * i);
? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?//use the JTS WKBReader for WKB parsing
? ? ? ? ? ? ? ?WKBReader wkbReader = new WKBReader();
? ? ? ? ? ? ? ?// 使用geotool的WKBReader 把字節(jié)數(shù)組轉成geometry對象。
? ? ? ? ? ? ? ?byte[] wkb = new byte[geometryAsBytes.length - 4];
? ? ? ? ? ? ? ?System.arraycopy(geometryAsBytes, 4, wkb, 0, wkb.length);
? ? ? ? ? ? ? ?dbGeometry = wkbReader.read(wkb);
? ? ? ? ? ? ? ?dbGeometry.setSRID(srid);
? ? ? ? ? ?return dbGeometry;
? ? ? ?}

完整使用例子,解析數(shù)據(jù)庫中的geometry對象,得到我們需要的點位數(shù)據(jù)。

//返回一個區(qū)域集合 ?區(qū)域由若干個點組成
public List < Area > geometryCollection2PressAreas(byte[] data) {
?? ?List < Area > areas= new ArrayList < > ();
??? ?try {
? ? ? ?//解析出空間集合層
?? ??? ?GeometryCollection geometryCollection = (GeometryCollection) GeometryUtil.getGeometryByBytes(data);
?? ??? ?int geometrySize = geometryCollection.getNumGeometries();
?? ??? ?for (int i1 = 0; i1 < geometrySize; i1++) {
?? ??? ??? ?try {
? ? ? ? ? ? ? ?//解析出多邊形集合層
?? ??? ??? ??? ?MultiPolygon multiPolygon = (MultiPolygon) geometryCollection.getGeometryN(i1);
?? ??? ??? ??? ?int size = (int) multiPolygon.getNumPoints();
?? ??? ??? ??? ?for (int i = 0; i < size; i++) {
?? ??? ??? ??? ??? ?try {
? ? ? ? ? ? ? ? ? ? ? ? //解析出多邊形
?? ??? ??? ??? ??? ??? ?Polygon polygon = (Polygon) multiPolygon.getGeometryN(i);
? ? ? ? ? ? ? ? ? ? ? ? //解析出多邊形中的多個點位
?? ??? ??? ??? ??? ??? ?Coordinate[] coordinates2 = polygon.getCoordinates();
?? ??? ??? ??? ??? ??? ?int size2 = coordinates2.length;
?? ??? ??? ??? ??? ??? ?Area area = new Area();
?? ??? ??? ??? ??? ??? ?area.area_pts = new ArrayList < > ();
?? ??? ??? ??? ??? ??? ?for (int j = 0; j < size2; j++) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? //點位對象 就一個x,一個y數(shù)據(jù)
?? ??? ??? ??? ??? ??? ??? ?Point point = new Point();
?? ??? ??? ??? ??? ??? ??? ?point.x = coordinates2[j].x;
?? ??? ??? ??? ??? ??? ??? ?point.y = coordinates2[j].y;
? ? ? ? ? ? ? ? ? ? ? ? ? ? //點位集合
?? ??? ??? ??? ??? ??? ??? ?area.area_pts.add(point);
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ?areas.add(area);
?? ??? ??? ??? ??? ?} catch (Exception e) {
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?} catch (Exception e) {
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ?}
?? ?} catch (Exception e) {
?? ??? ?e.printStackTrace();
?? ?}
?? ?return areas;
}

小結一下

其實以前存地理信息都是用的自己組裝的json字符串,占用空間太大。最近才發(fā)現(xiàn)mysql還有地理空間數(shù)據(jù)這個好東(發(fā)現(xiàn)新大陸~),空間節(jié)省了,讀取也快了。不過讀取數(shù)據(jù)庫中數(shù)據(jù)不知道還有沒有更好的方法,這篇介紹的都是自己手動轉的對象,不過暫時先能用就好。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java中的abstract和interface

    Java中的abstract和interface

    abstract和interface關鍵字在Java中隨處可見,它是Java三大特性封裝、繼承、多態(tài)特性的實現(xiàn)重要支柱之一。interface關鍵字用于定義接口抽象,其本質上是用于定義類型、定義類所具有的能力,下面來看看詳細內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • Java的動態(tài)代理模式之Cglib代理詳解

    Java的動態(tài)代理模式之Cglib代理詳解

    這篇文章主要介紹了Java的動態(tài)代理模式之Cglib代理詳解,Cglib代理也叫作?子類代理,它是在內(nèi)存中構建一個子類對象從而實現(xiàn)對目標對象功能擴展,?有些書也將Cglib代理歸屬到動態(tài)代理,需要的朋友可以參考下
    2023-11-11
  • springboot項目如何使用切面記錄用戶操作日志

    springboot項目如何使用切面記錄用戶操作日志

    這篇文章主要介紹了springboot項目如何使用切面記錄用戶操作日志,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java實現(xiàn)的剪刀石頭布游戲示例

    Java實現(xiàn)的剪刀石頭布游戲示例

    這篇文章主要介紹了Java實現(xiàn)的剪刀石頭布游戲,涉及java隨機數(shù)生成及邏輯判定等相關操作技巧,需要的朋友可以參考下
    2017-12-12
  • springboot?整合?dubbo?的實現(xiàn)組聚合詳情

    springboot?整合?dubbo?的實現(xiàn)組聚合詳情

    這篇文章主要介紹了springboot整合dubbo的實現(xiàn)組聚合詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • Java優(yōu)先隊列?priority?queue

    Java優(yōu)先隊列?priority?queue

    本文主要介紹了Java優(yōu)先隊列?priority?queue,優(yōu)先隊列是一種特殊的數(shù)據(jù)結構隊列中每一個元素都被分配到一個優(yōu)先權值,出隊順序按照優(yōu)先權值來劃分。一般有兩種出隊順序高優(yōu)先權出隊或低優(yōu)先權出隊,想了解具體內(nèi)容的小伙伴可以參考下文內(nèi)容,希望對你有所幫助
    2021-12-12
  • 通過實例學習JAVA對象轉成XML輸出

    通過實例學習JAVA對象轉成XML輸出

    這篇文章主要介紹了通過實例學習JAVA對象轉成XML輸出,做流程圖的項目時,新的流程定義為xml的,需要對xml與java對象進行互轉,下面我們來深入學習,需要的朋友可以參考下
    2019-06-06
  • IDEA在一個項目空間下管理多個項目的操作方法

    IDEA在一個項目空間下管理多個項目的操作方法

    這篇文章主要介紹了IDEA如何在一個項目空間下管理多個項目,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • spring boot使用RabbitMQ實現(xiàn)topic 主題

    spring boot使用RabbitMQ實現(xiàn)topic 主題

    本篇文章主要介紹了spring boot使用RabbitMQ實現(xiàn)topic 主題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • SpringBoot項目docker容器部署實現(xiàn)

    SpringBoot項目docker容器部署實現(xiàn)

    本文主要介紹了SpringBoot項目docker容器部署實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-03-03

最新評論