現在 gis ビジネスを行っているため、postgis でジオメトリ オブジェクトを操作する必要があります。geotools などのライブラリはたくさん見つかりましたが、できませんなぜかダウンロードしてしまいます。
jts もありますが、使いにくく、操作が非常に複雑です。別のクラス ライブラリ、geolatte-geom と geolatte-geojson が見つかりました。
ジオメトリ、文字列、json 間の変換を操作するために使用されます。 json と geojson についての私の個人的な理解は、出力形式が異なるということです。さらにジオメトリ固有のプロパティがいくつかあります。
主に String をジオメトリ オブジェクトに変換するために使用されます。wkt と wkb は便利で使いやすいです。
<!-- 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)); }
最近、経度および緯度のブロック情報をデータベースに保存する必要があるため、次を使用しました。 mysql オブジェクトの Geometry 属性 (ジオメトリ))。インターネットで色々な情報を集めましたが、実際に使ってみるとまだまだ色々な問題があるので、ちょっとバカっぽいけど実用的な方法をオススメします(私の使用環境 springboot ツールは sts です)。説明する。
まずはデータベース内の空間データ型を理解する
タイプ | 説明 | はじめに | 例 |
空間データ | 任意の空間タイプ | ||
Point | 座標値 | POINT(104.00924 30.46872) | |
Line | 線は一連の点を接続して形成されます | 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)),((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>
//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 サイトの他の関連記事を参照してください。