iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java如何操作gis geometry类型数据
  • 214
分享到

java如何操作gis geometry类型数据

2023-06-29 11:06:57 214人浏览 薄情痞子
摘要

这篇文章主要介绍“java如何操作GIS geometry类型数据”,在日常操作中,相信很多人在java如何操作gis geometry类型数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答

这篇文章主要介绍“java如何操作GIS geometry类型数据”,在日常操作中,相信很多人在java如何操作gis geometry类型数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java如何操作gis geometry类型数据”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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;}

到此,关于“java如何操作gis geometry类型数据”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: java如何操作gis geometry类型数据

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java如何操作gis geometry类型数据
    这篇文章主要介绍“java如何操作gis geometry类型数据”,在日常操作中,相信很多人在java如何操作gis geometry类型数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-29
  • java操作gisgeometry类型数据方式
    目录java操作gisgeometry类型数据pom.xml文件如下java读取数据库geometry操作小结一下java操作gis geometry类型数据 现在做的gis方面的业...
    99+
    2024-04-02
  • java mybatis如何操作postgresql array数组类型
    目录我定义了几个基础数据类型的数组java mybatis操作 postgresql array数组类型备忘找了半天没有找到postgresql中关于array数组类型的字段如何对应...
    99+
    2024-04-02
  • Bash中的Java数据类型:如何实现重定向操作?
    Bash是一种常用的Unix shell,它提供了很多基础的命令和工具,可以用于执行各种系统管理和编程任务。Java是一种广泛使用的编程语言,也被用于开发各种各样的应用程序。在Bash中,我们可以通过重定向操作将Java程序输出的数据重定...
    99+
    2023-11-11
    数据类型 重定向 bash
  • 如何在Bash中使用Java数据类型进行重定向操作?
    当我们在Bash中使用Java数据类型进行重定向操作时,有时候会遇到一些问题。在本文中,我们将探讨如何在Bash中使用Java数据类型进行重定向操作。 重定向是一种非常常见的操作,它可以将标准输入、标准输出和标准错误输出重定向到指定的文件或...
    99+
    2023-11-11
    数据类型 重定向 bash
  • Java中的数据类型:如何在Bash中进行重定向操作?
    在Java中,数据类型是指用于存储数据的变量类型。Java中的数据类型分为两大类,基本数据类型和引用数据类型。基本数据类型包括整型、浮点型、布尔型和字符型,引用数据类型包括类、接口、数组等。在Java中,我们需要经常进行数据类型的转换和操...
    99+
    2023-11-11
    数据类型 重定向 bash
  • 数据库操作类型是什么
    这篇文章主要介绍了数据库操作类型是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。SQL语言共分为四大类:数据查询语言DQL,数据操作语言DM...
    99+
    2024-04-02
  • Python数据类型和常用操作
    目录一、数值二、字符串三、列表四、元组五、字典六、集合一、数值 数值数据类型用于存储数值,数据类型不可改变,改变会分配一个新的对象,在Python中,“与或非&rdquo...
    99+
    2024-04-02
  • ASP 数据类型中的数组是如何在 Linux 操作系统中操作的?
    在 ASP 开发中,数组是非常常见的数据类型,它可以存储一系列的数据,比如数字、字符串、对象等等。在 Linux 操作系统中,我们同样可以使用数组来存储数据,并对其进行操作。 在 Linux 操作系统中,我们可以使用多种编程语言来实现数组...
    99+
    2023-06-16
    数据类型 数组 linux
  • MySQL 中怎么操作JSON数据类型
    今天就跟大家聊聊有关MySQL 中怎么操作JSON数据类型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。创建一个 JSON 字段的表首先先创建一个表...
    99+
    2024-04-02
  • 浅谈python数据类型及其操作
    目录一、Number 数字二、String 字符串三、List 列表四、Tuple 元组五、Sets集合六、Dictionary 字典 (非常重要)一、Number 数字 1.内置...
    99+
    2024-04-02
  • MySQL的约束类型、数据库操作、数据表操作大全(简述)
    目录 一.数据库的操作语法 二.MySQL数据库约束 三.数据类型 四.数据表操作 作者简介: tq02,一个想成为编程高手的梦中人作者主页: tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主学习专栏:  &...
    99+
    2023-09-14
    数据库 mysql 笔记 sql
  • 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类型
  • python数据类型-列表创建和操作
    列表创建和操作a)  创建列表b)  基本操作c)  遍历与其说  列表  它是一个数据类型,用起来 更像一个灵活多变的数据存储方案 创建列表创建列表例子player = 'mao 80 50'   mao = '100 60 0'   z...
    99+
    2023-01-31
    数据类型 操作 列表
  • python-pandas创建Series数据类型的操作
    1.什么是pandas 2.查看pandas版本信息 print(pd.__version__) 输出: 0.24.1 3.常见数据类型 常见的数据类型: - 一维: ...
    99+
    2024-04-02
  • Bash中的Java数据类型:如何使用重定向操作来提高效率?
    Bash是一种常用的Shell语言,常用于在Unix和Linux系统上编写脚本。而Java是一种面向对象的编程语言,常用于开发各种类型的应用程序。在Bash中使用Java可以帮助我们更好地管理和处理数据,提高工作效率。本文将重点介绍Bas...
    99+
    2023-11-11
    数据类型 重定向 bash
  • java如何定义日期类型数据
    在Java中,日期类型数据通常使用java.util.Date类来表示。可以使用new Date()来创建一个表示当前时间的Date...
    99+
    2024-03-06
    java
  • java对clob类型数据如何处理
    在Java中处理CLOB类型数据有多种方法,可以使用JDBC API、Hibernate、MyBatis等工具来操作CLOB类型数据...
    99+
    2023-10-18
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作