返回顶部
首页 > 资讯 > 后端开发 > Python >java操作gisgeometry类型数据方式
  • 663
分享到

java操作gisgeometry类型数据方式

2024-04-02 19:04:59 663人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录java操作GISgeometry类型数据pom.xml文件如下java读取数据库geometry操作小结一下java操作gis geometry类型数据 现在做的gis方面的业

java操作gis geometry类型数据

现在做的gis方面的业务,所以需要操作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) {
        // 模拟数据库中直接取出的geometry对象值(他是二进制的)
        // WKT 是字符串形式,类似"POINT(1 2)"的形式
        // 所以WKT转  geometry,相当于是字符串转geometry
        // WKB转  geometry,相当于是字节转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读取数据库geometry

最近因为需要存一些经纬度块信息到数据库,所以用到了Mysql中的Geometry属性(几何对象)。在网上搜集了很多资料,到真正用的时候还是各种问题,所以下面推荐一种可能有点笨但是实用的方法(我的使用环境SpringBoot工具是sts),下面就举个例子来说明一下。

操作

先了解一下数据库中空间数据类型有哪些

类型说明简介例子
Geometry间数据任意一种空间类型 
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空间数据集合集合类,可以包括多个点、线、多边形GEOMETRYCOLLECTION(POINT(1 1), POINT(3 3), LINESTRING(1 1, 2 2))

接着往数据库插入一个测试数据,插入的是一个空间数据集合里面包含多个多边形集合。

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))))'));

数据准备好了就准备开始准备读取操作。

在pom.xml添加操作Geometry等对象的依赖。

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

本来先是想直接在实体类确定类型直接转对象,但是用了后发现不行,所以我就直接设置成Object,在mysql中存储Geometry使用的是二进制,所以下面直接把二进制通过jts转成Geometry对象。

//private Geometry geom; 不可行
private Object geomAsBytes; //可行  最终得到的是一个byte数组
     //直接把数据库中的byte[]转Geometry对象
  public static Geometry getGeometryByBytes( byte[]  geometryAsBytes) throws Exception {
           Geometry dbGeometry = null;
               // 字节数组小于5,说明geometry有问题
               if (geometryAsBytes.length < 5) {
                                     return null;
               }
 
               //这里是取字节数组的前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 把字节数组转成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;
       }

完整使用例子,解析数据库中的geometry对象,得到我们需要的点位数据。

//返回一个区域集合  区域由若干个点组成
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数据
                            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字符串,占用空间太大。最近才发现mysql还有地理空间数据这个好东(发现新大陆~),空间节省了,读取也快了。不过读取数据库中数据不知道还有没有更好的方法,这篇介绍的都是自己手动转的对象,不过暂时先能用就好。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java操作gisgeometry类型数据方式

本文链接: https://www.lsjlt.com/news/142206.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java操作gisgeometry类型数据方式
    目录java操作gisgeometry类型数据pom.xml文件如下java读取数据库geometry操作小结一下java操作gis geometry类型数据 现在做的gis方面的业...
    99+
    2024-04-02
  • java如何操作gis geometry类型数据
    这篇文章主要介绍“java如何操作gis geometry类型数据”,在日常操作中,相信很多人在java如何操作gis geometry类型数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-29
  • mysql,数据类型与表操作
    一、mysql基本认知 创建用户 create host aa identified with mysql_native_password by ""; 修改用户权限 alter user root@"localhost" identfi...
    99+
    2018-12-14
    mysql,数据类型与表操作
  • java long 类型数据的赋值方式
    目录java long类型数据的赋值问题解决把null赋值给long产生的奇怪问题问题产生的原因java long类型数据的赋值 问题 当程序出现较大的数值的时候(超过int类型:-...
    99+
    2024-04-02
  • 数据类型和创建操作数据库
        数据库的数据类型有×××、浮点型、字符型、每种数据类型各自有各自的使用范围,与C语言和Java等语言有大同小异之处,这里再说明一下  &n...
    99+
    2024-04-02
  • 数据库操作类型是什么
    这篇文章主要介绍了数据库操作类型是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。SQL语言共分为四大类:数据查询语言DQL,数据操作语言DM...
    99+
    2024-04-02
  • Python数据类型和常用操作
    目录一、数值二、字符串三、列表四、元组五、字典六、集合一、数值 数值数据类型用于存储数值,数据类型不可改变,改变会分配一个新的对象,在Python中,“与或非&rdquo...
    99+
    2024-04-02
  • MySQL 中怎么操作JSON数据类型
    今天就跟大家聊聊有关MySQL 中怎么操作JSON数据类型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。创建一个 JSON 字段的表首先先创建一个表...
    99+
    2024-04-02
  • 浅谈python数据类型及其操作
    目录一、Number 数字二、String 字符串三、List 列表四、Tuple 元组五、Sets集合六、Dictionary 字典 (非常重要)一、Number 数字 1.内置...
    99+
    2024-04-02
  • PostgreSQL -- 数组类型操作
    一、数组类型创建表 数组类型,要求数组内的元素属于同一种类型,当出现No function matches the given name and argument types. You might need...
    99+
    2024-04-02
  • 浅谈MYSQL中数据类型和操作数据表
    小编这次要给大家分享的是浅谈MYSQL中数据类型和操作数据表,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。数据类型和操作数据表1.1 MySQL类型之整型1.2 My...
    99+
    2024-04-02
  • Redis基本数据类型和操作方法有哪些
    本文小编为大家详细介绍“Redis基本数据类型和操作方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Redis基本数据类型和操作方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2022-11-30
    redis
  • MySQL的约束类型、数据库操作、数据表操作大全(简述)
    目录 一.数据库的操作语法 二.MySQL数据库约束 三.数据类型 四.数据表操作 作者简介: tq02,一个想成为编程高手的梦中人作者主页: tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主学习专栏:  &...
    99+
    2023-09-14
    数据库 mysql 笔记 sql
  • java mybatis如何操作postgresql array数组类型
    目录我定义了几个基础数据类型的数组java mybatis操作 postgresql array数组类型备忘找了半天没有找到postgresql中关于array数组类型的字段如何对应...
    99+
    2024-04-02
  • MySQL数据类型对应Java数据类型
    ### 数值类型 - TINYINT:大小(1byte),范围(有符号为-128到127,无符号为0到255),用于小整数值,对应于java中的Byte类型; - SMALLINT:大小(2byte),范围(有符号为-32768到3276...
    99+
    2023-09-07
    mysql java 数据库
  • 【java的类型数据】——八大类型数据
    文章目录 前言字面常量字面常量的分类: 数据类型和变量变量的包装类和范围范围整型变量byteintshortlong 浮点型变量双精度浮点型double单精度浮点型float 字符型变量char布尔型变量 boole...
    99+
    2023-08-16
    java 开发语言 类型数据 学习
  • Python中数字(Number)数据类型常用操作
    目录数字运算类型转换数学库math、cmath随机函数库 random数字运算 =:用于给变量赋值type(x):查看数据所属类型isinstance(x, A_tuple):判断数...
    99+
    2023-02-16
    Python 数字数据类型 Python Number类型
  • java long类型数据的赋值方式是什么
    今天小编给大家分享一下java long类型数据的赋值方式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。ja...
    99+
    2023-07-02
  • Java ArrayList中存放引用数据类型的方式
    目录ArrayList中存放引用数据类型看下面一个例子Java 引用数据类型 ArrayList集合引用数据类型(类)ArrayList 集合ArrayList中存放引用数据类型 A...
    99+
    2024-04-02
  • MySQL学习笔记-数据类型与操作数据表
    MySQL学习笔记-数据类型与操作数据表数据类型:  1.字符型  2.整型  3.浮点型  4.日期时间型数据表操作:  1.插入记录 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作