Java读取数据库Geometry

您所在的位置:网站首页 java查询数据库乱码 Java读取数据库Geometry

Java读取数据库Geometry

2024-02-12 22:45| 来源: 网络整理| 查看: 265

简介

最近因为需要存一些经纬度块信息到数据库,所以用到了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等对象的依赖。

com.vividsolutions jts 1.13

本来先是想直接在实体类确定类型直接转对象,但是用了后发现不行,所以我就直接设置成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 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还有地理空间数据这个好东(发现新大陆~),空间节省了,读取也快了。不过读取数据库中数据不知道还有没有更好的方法,这篇介绍的都是自己手动转的对象,不过暂时先能用就好。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3