最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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è)務(wù),所以需要操作postgis中的geometry對象,找了很多的庫,比如geotools,但是莫名下載不下來。

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

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

主要用于將String轉(zhuǎn)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對象值(他是二進(jìn)制的)
? ? ? ? // WKT 是字符串形式,類似"POINT(1 2)"的形式
? ? ? ? // 所以WKT轉(zhuǎn) ?geometry,相當(dāng)于是字符串轉(zhuǎn)geometry
? ? ? ? // WKB轉(zhuǎn) ?geometry,相當(dāng)于是字節(jié)轉(zhuǎn)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坐標(biāo)值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ù)準(zhǔn)備好了就準(zhǔn)備開始準(zhǔn)備讀取操作。

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

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

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

//private Geometry geom; 不可行
private Object geomAsBytes; //可行 ?最終得到的是一個byte數(shù)組
?? ? //直接把數(shù)據(jù)庫中的byte[]轉(zhuǎn)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ù)組轉(zhuǎn)成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;
}

小結(jié)一下

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

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

相關(guān)文章

  • 一文帶你了解FastExcel的使用

    一文帶你了解FastExcel的使用

    我們知道?EasyExcel?在作者從阿里離職之后就停止維護(hù)了,但在前兩周?EasyExcel?原作者推出了他的升級版框架?FastExcel,下面小編就來和大家聊聊FastExcel的具體使用吧
    2024-12-12
  • java時間段查詢將00:00:00更換成23:59:59

    java時間段查詢將00:00:00更換成23:59:59

    本文主要介紹了java時間段查詢將00:00:00更換成23:59:59,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • springboot yml配置文件使用@project.xxxx@啟動報錯Do not use @ for indentation問題

    springboot yml配置文件使用@project.xxxx@啟動報錯Do not 

    這篇文章主要介紹了springboot yml配置文件使用@project.xxxx@啟動報錯Do not use @ for indentation問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Mybatis從3.4.0版本到3.5.7版本的迭代方法實現(xiàn)

    Mybatis從3.4.0版本到3.5.7版本的迭代方法實現(xiàn)

    本文主要介紹了Mybatis從3.4.0版本到3.5.7版本的迭代方法實現(xiàn),包括主要的功能增強(qiáng)、不兼容的更改和修復(fù)的錯誤,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • java實現(xiàn)頁面置換算法

    java實現(xiàn)頁面置換算法

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)頁面置換算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Java常用數(shù)字工具類 大數(shù)乘法、加法、減法運(yùn)算(2)

    Java常用數(shù)字工具類 大數(shù)乘法、加法、減法運(yùn)算(2)

    這篇文章主要為大家詳細(xì)介紹了Java常用數(shù)字工具類,大數(shù)乘法、加法、減法運(yùn)算,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Spring Boot構(gòu)建優(yōu)雅的RESTful接口過程詳解

    Spring Boot構(gòu)建優(yōu)雅的RESTful接口過程詳解

    這篇文章主要介紹了spring boot構(gòu)建優(yōu)雅的RESTful接口過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • maven實現(xiàn)docker自動化部署插件的使用

    maven實現(xiàn)docker自動化部署插件的使用

    本文主要介紹了maven實現(xiàn)docker自動化部署插件的使用,分享給大家,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java多線程工具CompletableFuture詳解

    Java多線程工具CompletableFuture詳解

    這篇文章主要介紹了Java多線程工具CompletableFuture詳解,CompletableFuture?是?java?1.8?追加的新特性,通俗的話來說,是一個函數(shù)式的,用于控制多任務(wù)同步、異步組合操作的工具,需要的朋友可以參考下
    2024-01-01
  • 淺談Spring框架中@Autowired和@Resource的區(qū)別

    淺談Spring框架中@Autowired和@Resource的區(qū)別

    最近review別人代碼的時候,看到了一些@Autowired不一樣的用法,覺得有些意思,下面這篇文章主要給大家介紹了關(guān)于Spring框架中@Autowired和@Resource區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-10-10

最新評論

星座| 界首市| 峨边| 山东| 鲁山县| 永顺县| 阜阳市| 法库县| 雷波县| 阿图什市| 石家庄市| 化隆| 新沂市| 万载县| 民丰县| 白银市| 中宁县| 吕梁市| 金阳县| 蒲江县| 灵璧县| 揭东县| 三原县| 上虞市| 灯塔市| 林芝县| 新津县| 武平县| 老河口市| 平邑县| 宁明县| 贡山| 苏尼特左旗| 托克托县| 宜兰市| 五河县| 嵊州市| 安国市| 普兰店市| 炉霍县| 漳州市|