Ich betreibe derzeit GIS-Geschäfte, daher muss ich das Geometrieobjekt in PostGIS bedienen. Ich habe viele Bibliotheken gefunden, z. B. Geotools, aber ich Ich kann es aus irgendeinem Grund nicht herunterladen.
Es gibt auch JTS, aber es ist nicht einfach zu bedienen und sehr kompliziert zu bedienen. Habe eine weitere Klassenbibliothek gefunden – geolatte-geom und geolatte-geojson.
wird verwendet, um die gegenseitige Konvertierung zwischen Geometrie, String und JSON durchzuführen. Mein persönliches Verständnis von JSON und GeoJson ist, dass die Ausgabeformate unterschiedlich sind. Es gibt noch einige weitere geometriespezifische Eigenschaften.
Wkt und wkb werden hauptsächlich zum Konvertieren von String in Geometrieobjekte verwendet und sind bequem und einfach zu verwenden.
<!-- 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)); }
Vor Kurzem muss ich einige Längen- und Breitengradblockinformationen im speichern Datenbank, daher wird MySQL als Geometrieeigenschaft (Geometrieobjekt) verwendet. Ich habe viele Informationen im Internet gesammelt, aber es gibt immer noch verschiedene Probleme, wenn ich sie tatsächlich verwende. Daher empfehle ich eine Methode, die vielleicht etwas dumm, aber praktisch ist (mein Verwendungsumgebungs-Springboot-Tool ist sts). Hier ist ein Beispiel zu veranschaulichen.
Verstehen Sie zunächst, welche räumlichen Datentypen in der Datenbank vorhanden sind
Typ#🎜 🎜# | BeschreibungEinführung | Beispiel | |
#🎜 🎜# Raumdaten | Jede Art von Raumtyp | ||
Punkt# 🎜🎜# | KoordinatenwertPOINT(104.00924 30.46872) | LineString | |
LINESTRING(1 1, 1 1, 1 1) | Polygon | Polygon | |
POLYGON((1 1, 2 2, 3 3, 4 4, 5 5)) | MultiPoint | Punktsammlung | |
MULTIPOINT (1 1, 2 2, 1 1) | MultiLineString | Line Collection | |
MULTILINESTRING((1 1, 2 2), (1 1, 1 1)) | MultiPolygon | #🎜 🎜#Polygon-Sammlung | |
MULTIPOLYGON(((0 0, 1 0, 1 1, 0 1, 0 0)), ((1 1, 1 1, 1 1, 1 1, 1 1))) | GeometryCollection | Geodatensammlung#🎜🎜 ##🎜 🎜#Sammlungsklasse, kann mehrere Punkte, Linien, Polygone enthalten | |
Fügen Sie dann Testdaten in die Datenbank ein. Es wird eine räumliche Datensammlung mit mehreren Polygonsammlungen eingefügt. | INSERT INTO `geometry`(`geome`) VALUES(GeomFromText('GEOMETRYCOLLECTION(MULTIPOLYGON(((104.009241 30.468972,104.009229 30.468961,104. 0 09225 30.468997)),((104.009241 30.468972 ,104.009229 30.468961,104.009225 30.468997))) ));#🎜 🎜# | Wenn die Daten fertig sind, sind sie fertig gelesen werden. |
//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; }
//返回一个区域集合 区域由若干个点组成 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; }Nach dem Login kopierenDas obige ist der detaillierte Inhalt vonWie bearbeite ich Daten vom Typ GIS-Geometrie in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!