Comment exploiter les données de type SIG Géométrie en Java ?
王林
Libérer: 2023-04-22 23:10:06
avant
1787 Les gens l'ont consulté
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.
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
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.
À 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;
}
Copier après la connexion
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.
//返回一个区域集合 区域由若干个点组成
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;
}
Copier après la connexion
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!
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn