ホームページ  >  記事  >  Java  >  Java で GIS ジオメトリ タイプのデータを操作するにはどうすればよいですか?

Java で GIS ジオメトリ タイプのデータを操作するにはどうすればよいですか?

王林
王林転載
2023-04-22 23:10:061785ブラウズ

java は gis ジオメトリ タイプ データを操作します

現在 gis ビジネスを行っているため、postgis でジオメトリ オブジェクトを操作する必要があります。geotools などのライブラリはたくさん見つかりましたが、できませんなぜかダウンロードしてしまいます。

jts もありますが、使いにくく、操作が非常に複雑です。別のクラス ライブラリ、geolatte-geom と geolatte-geojson が見つかりました。

ジオメトリ、文字列、json 間の変換を操作するために使用されます。 json と geojson についての私の個人的な理解は、出力形式が異なるということです。さらにジオメトリ固有のプロパティがいくつかあります。

主に String をジオメトリ オブジェクトに変換するために使用されます。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 はデータベース ジオメトリを読み取ります

最近、経度および緯度のブロック情報をデータベースに保存する必要があるため、次を使用しました。 mysql オブジェクトの Geometry 属性 (ジオメトリ))。インターネットで色々な情報を集めましたが、実際に使ってみるとまだまだ色々な問題があるので、ちょっとバカっぽいけど実用的な方法をオススメします(私の使用環境 springboot ツールは sts です)。説明する。

操作

まずはデータベース内の空間データ型を理解する

##ジオメトリ空間データ任意の空間タイプPointPoint座標値POINT(104.00924 30.46872)##LineString #PolygonPolygon は複数の線で構成されていますPOLYGON((1 1, 2 2, 3 3, 4 4, 5 5))MultiPointポイント コレクション複数のポイントを含むコレクション クラスMULTIPOINT(1 1, 2 2, 1 1)MultiLineStringLine コレクション複数の行を含むコレクション クラス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))#次に、テスト データをデータベースに挿入します。挿入されるのは、複数のポリゴン コレクションを含む空間データ コレクションです。
タイプ 説明 はじめに
Line 線は一連の点を接続して形成されます LINESTRING(1 1, 1 1, 1 1)

INSERT INTO `geometry`(`geome`) VALUES(GeomFromText('GEOMETRYCOLLECTION(MULTIPOLYGON(((104.009241 30.468972,104.009229 30.468961,104.009225 30.468997)),((1 04.0) 09241 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 にジオメトリなどのオブジェクトを操作するための依存関係を追加します。

<dependency>
    <groupId>com.vividsolutions</groupId>
    <artifactId>jts</artifactId>
    <version>1.13</version>
</dependency>

本来はエンティティクラスで直接型を判定して直接オブジェクトに変換したかったのですが、使ってみるとうまくいかないことがわかったので直接Objectにしました。 mysql に Geometry を格納するためにバイナリが使用されるため、jts を介してバイナリ Convert to 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;
       }

完全な使用例。データベース内のジオメトリ オブジェクトを解析し、必要なポイント データを取得します。

rree

以上がJava で GIS ジオメトリ タイプのデータを操作するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。