Heim  >  Artikel  >  Java  >  Wie bearbeite ich Daten vom Typ GIS-Geometrie in Java?

Wie bearbeite ich Daten vom Typ GIS-Geometrie in Java?

王林
王林nach vorne
2023-04-22 23:10:061724Durchsuche

Java betreibt GIS-Geometrietypdaten

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.

pom.xml-Datei lautet wie folgt

<!-- 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 liest Datenbankgeometrie

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.

Betrieb

Verstehen Sie zunächst, welche räumlichen Datentypen in der Datenbank vorhanden sind

BeschreibungEinführungBeispielGeometriePunktKoordinatenwertPOINT(104.00924 30.46872)LineString# 🎜 🎜#线#🎜 🎜#Linie, gebildet durch die Verbindung einer Reihe von PunktenLINESTRING(1 1, 1 1, 1 1) PolygonPolygon besteht aus mehreren LinienPOLYGON((1 1, 2 2, 3 3, 4 4, 5 5)) MultiPointPunktsammlungKlasse festlegen, die mehrere Punkte enthält MULTIPOINT (1 1, 2 2, 1 1)MultiLineStringLine CollectionCollection-Klasse, einschließlich Multiple LinienMULTILINESTRING((1 1, 2 2), (1 1, 1 1))MultiPolygonSammlungsklasse, die mehrere Polygone enthältGEOMETRYCOLLECTION(POINT(1 1), POINT(3 3), LINESTRING(1 1, 2 2))#🎜 🎜##🎜 🎜# Fügen Sie dann Testdaten in die Datenbank ein. Es wird eine räumliche Datensammlung mit mehreren Polygonsammlungen eingefügt. Fügen Sie Abhängigkeiten für den Betrieb von Geometrie und anderen Objekten in pom.xml hinzu.
<dependency>
    <groupId>com.vividsolutions</groupId>
    <artifactId>jts</artifactId>
    <version>1.13</version>
</dependency>
Typ#🎜 🎜#
#🎜 🎜# Raumdaten Jede Art von Raumtyp
Punkt# 🎜🎜#
#🎜 🎜#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
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.
Ursprünglich wollte ich den Typ direkt in der Entitätsklasse bestimmen und direkt in das Objekt konvertieren, aber nachdem ich es verwendet hatte, stellte ich fest, dass es nicht funktionierte, also habe ich es direkt auf gesetzt Das Objekt wird in MySQL im Binärformat gespeichert. Im Folgenden wird die Binärdatei direkt über JTS in ein Geometrieobjekt konvertiert.

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

Vollständiges Anwendungsbeispiel, analysieren Sie das Geometrieobjekt in der Datenbank und erhalten Sie die Punktdaten, die wir benötigen.
//返回一个区域集合  区域由若干个点组成
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;
}

Das 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen