Maison  >  Article  >  Java  >  Comment exploiter les données de type SIG Géométrie en Java ?

Comment exploiter les données de type SIG Géométrie en Java ?

王林
王林avant
2023-04-22 23:10:061785parcourir

Java exploite des données de type géométrie SIG

Maintenant, je fais des affaires de SIG, je dois donc exploiter l'objet géométrique dans Postgis. J'ai trouvé de nombreuses bibliothèques, telles que des géooutils, mais je ne peux pas le télécharger pour une raison quelconque.

Il existe aussi jts, mais ce n'est pas simple à utiliser et c'est très compliqué à faire fonctionner. J'ai trouvé une autre bibliothèque de classe : geolatte-geom et geolatte-geojson.

Utilisé pour opérer la conversion entre géométrie, String et json. Ma compréhension personnelle de json et geojson est que les formats de sortie sont différents. Il existe des propriétés plus spécifiques à la géométrie.

Principalement utilisés pour convertir String en objets géométriques, wkt et wkb sont pratiques et faciles à utiliser.

Le fichier pom.xml est le suivant

<!-- 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 lit la géométrie de la base de données

Récemment, parce que j'ai besoin de sauvegarder certaines informations de bloc de longitude et de latitude dans la base de données, j'ai utilisé l'attribut Geometry (objet de géométrie) dans MySQL. J'ai collecté beaucoup d'informations sur Internet, mais il y a encore divers problèmes lorsque je l'utilise réellement, je recommande donc une méthode qui peut être un peu stupide mais pratique (mon outil Springboot de mon environnement d'utilisation est sts). pour illustrer. "Opération" type spatial

PointPointValeur de coordonnéePOINT(104.00924 30.46872)LineStringLineLigne, reliée par une série de pointsLINESTRING(1 1, 1 1 , 1 1) PolygonPolygon se compose de plusieurs lignesPOLYGON((1 1, 2 2, 3 3, 4 4, 5 5))MultiPointCollection de pointsclasse d'ensemble, y compris plusieurs points MULTIPOINT(1 1, 2 2, 1 1)MultiLineStringCollection de lignesclasse d'ensemble, contenant plusieurs lignesMULTILINESTRING((1 1, 2 2), (1 1, 1 1))MultiPolygonCollection PolygonClasse Collection, contenant plusieurs polygonesMULTIPOLYGON(((0 0, 1 0, 1 1, 0 1, 0 0)), ((1 1, 1 1, 1 1, 1 1, 1 1)))GeometryCollectionCollecte de données spatialesClasse Collection, qui peut inclure plusieurs points, lignes, polygonesGEOMETRYCOLLECTION(POINT(1 1), POINT( 3 3), LINESTRING(1 1, 2 2)) Insérez ensuite des données de test dans la base de données. Ce qui est inséré est une collection de données spatiales contenant plusieurs collections de polygones. INSÉRER DANS `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))),MULTIPOLYGONE (((104.009241 30.468972,104.009229 30.468961,104.009225 30.468997)))'));
<dependency>
    <groupId>com.vividsolutions</groupId>
    <artifactId>jts</artifactId>
    <version>1.13</version>
</dependency>
À l'origine, je voulais déterminer directement le type dans la classe d'entité et le convertir directement en objet, mais après l'avoir utilisé, j'ai découvert que cela ne fonctionnait pas, donc je l'ai directement défini sur Objet binaire. stocker la géométrie dans MySQL, donc je convertis directement le binaire via l'objet 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;
       }
//返回一个区域集合  区域由若干个点组成
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;
}
Lorsque les données sont prêtes, l'opération de lecture est prête. Ajoutez des dépendances pour les objets opérationnels tels que la géométrie dans pom.xml.
Exemple d'utilisation complet, analysez l'objet géométrique dans la base de données et obtenez les données ponctuelles dont nous avons besoin.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer