- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在读取一组包含大量 multypoligons 的数据。我正在使用 Geotools,我想将此列表存储在 mysql 数据库表中。
我不知道如何以有效的方式存储形状并能够重新创建多多边形对象。
如果我得到多面体的坐标,那么我会得到一个数组,其中包含该几何体的所有顶点的值(在几何体是复合体的情况下,该数组包含组件的所有顶点,顺序为其中组件出现在几何中),但我不知道如何使用这些坐标重新创建新的多面体。
请在下面找到我得到的结果。
private List<Shape> parseFile2ShapeList(File file) {
List<Shape> shapes = new ArrayList<Shape>();
FileDataStore myData = null;
SimpleFeatureIterator sfit = null;
try {
// Extract all features
myData = FileDataStoreFinder.getDataStore( file );
SimpleFeatureSource source = myData.getFeatureSource();
SimpleFeatureCollection sfc = source.getFeatures();
sfit = sfc.features();
// Read the features and store in a list only the ones with Venue_ID
while (sfit.hasNext()) {
SimpleFeature feature = sfit.next();
String id = (String) feature.getAttribute("ID");
MultiPolygon mulPoly = (MultiPolygon) feature.getAttribute("the_geom");
Shape shape = new Shape(id, mulPoly);
shapes.add(shape);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
sfit.close();
myData.dispose();
}
return shapes;
}
private boolean insertShapes(List<Shape> shapes) {
// Insert the shapes in the DB
boolean inserted = false;
try (Database db = new Database()) {
// Store in the DB all the shapes
for (Shape shape : shapes) {
db.getShapesDao().insertShape(shape); // What shall I store in the DB if the shape is a multipolygon? What if it is any Geometry?
}
inserted = true;
} catch (SQLException e) {
e.printStackTrace();
inserted = false;
} catch (IOException e) {
e.printStackTrace();
inserted = false;
}
return inserted;
}
private Shape selectShape(String shape_id) {
Shape shape = null;
try (Database db = new Database()) {
// Retrieve the shape
shape = db.getShapesDao().getShapeById(shape_id); // How do I recreate a multipolygon (or any other Geometry inserted in the DB?)
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return shape;
}
public void main() {
// display a data store file chooser dialog for shapefiles
File file = JFileDataStoreChooser.showOpenFile("shp", null);
if (file == null) {
return;
}
// Read the file and load in memory the venues
List<Shape> shapes = parseFile2ShapeList(file);
System.out.println("Shapes parsed: " + retrieved.size());
for (Shape shape : shapes) {
System.out.println("\t ID: " + shape.getId() );
}
// Insert in database
boolean inserted = insertVenues(venues);
System.out.println("Insertion successful? " + inserted);
// Retrieve from database
List<Shape> retrievedShapes = new ArrayList<Shape>();
for (Shape shape : shapes) {
Shape retrieved = selectShape(shape.getId());
retrievedShapes.add(retrieved);
}
System.out.println("Shapes retrieved: " + retrieved.size());
for (Shape shape : retrievedShapes) {
System.out.println("\t ID: " + shape.getId() );
}
}
目前我知道如何从多边形中取回多边形(因为我只是存储坐标并使用它们创建多边形),但我不知道如何存储和检索多边形。通常,最佳解决方案适用于任何几何体:
parse geometry obj -> store geometry to DB (with associated ID) -> (some time later...) -> retrieve geometry information (by ID) -> construct new geometry obj
新对象将是原始对象的副本,不再可用。
PS:序列化一个 Java 对象并将其存储在数据库中是我不想做的事情,因为我希望在数据库中有一些人类可读的东西。 :)
----编辑
我正在根据收到的答案添加更多信息(谢谢@user2731872!)。
我想在其中存储内容的数据库表具有以下架构:
mysql> describe shape_table;
+-----------------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+----------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| shape_id | varchar(32) | NO | | NULL | |
| shape | text | NO | | NULL | |
+-----------------+----------------------+------+-----+---------+----------------+
此表还有其他列,但目前它们不相关。无论如何,给定输入文件,我想将每个几何图形(shape
列)存储在不同的行中。
在我的程序中,给定一个 shape_id
,我想检索有关形状的相关信息(shape
列),然后构建几何。
最佳答案
您的工作水平太低,因此给自己造成了压力。 GeoTools 被设计(对于大多数用户/用途)与 DataStores 一起工作,DataStores 抽象出细节和为您处理几何和属性的功能。因此,您的问题分为两部分 - 第 1 部分读取 shapefile,第 2 部分将特征写入数据库。您已经成功完成了第一步,第二步有点棘手但相当容易。
获取到数据库的连接(我已经安装了 PostGIS,但 MySql 应该以相同的方式工作):
params.put("user", "geotools");
params.put("passwd", "geotools");
params.put("port", "5432");
params.put("host", "127.0.0.1");
params.put("database", "geotools");
params.put("dbtype", "postgis");
dataStore = DataStoreFinder.getDataStore(params);
然后将特征发送到数据源:
SimpleFeatureSource featureSource = dataStore
.getFeatureSource(schema.getName().getLocalPart());
if (featureSource instanceof SimpleFeatureStore) {
SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
featureStore.setTransaction(transaction);
try {
List < FeatureId > ids = featureStore.addFeatures(features);
transaction.commit();
} catch (Exception problem) {
problem.printStackTrace();
transaction.rollback();
} finally {
transaction.close();
}
dataStore.dispose();
return true;
} else {
dataStore.dispose();
System.err.println("Database not writable");
return false;
}
在需要时创建新表的句柄有些困惑,您可以在 full code 中看到,它会在需要时创建一个新表或附加到现有表。
关于java - Geotools MultiPolygon 到数据库并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30782841/
我有 2 个相交的 OGR 多边形,因此我想将它们级联并联。我尝试了这个,但它返回给我空并且不合并它。似乎这仅适用于多边形,不适用于多重多边形。最好的方法是什么? >>geom = ogr.Geome
从包含相当多(大约 20000)个可能部分重叠的多边形的 shapefile 开始,我需要提取所有通过与不同“边界”相交而产生的子多边形。 在实践中,从一些模型数据开始: library(tibble
我尝试在我的 postgre 数据库中添加 MultiPolygon 几何图形,因此我使用了以下 SQL 语句: 'INSERT INTO potentiel_foncier_ccry (nature
我正在尝试将我的 polygon 列类型更改为 multipolygon 列类型。 我的代码很简单。 change_column :messages, :area_shape, :multipolyg
我正在读取一组包含大量 multypoligons 的数据。我正在使用 Geotools,我想将此列表存储在 mysql 数据库表中。 我不知道如何以有效的方式存储形状并能够重新创建多多边形对象。 如
OpenLayers 3.10.1 中的默认标签标记 MultiPolygon 的每个部分。我想知道是否可以只标记 MultiPolygon 中的第一个多边形。 最佳答案 您可以为带有 geometr
我正在使用geotools库来提取位置信息。这样我就得到了一个类型的对象 class com.vividsolutions.jts.geom.MultiPolygon 我现在想通过 jdbc 连接将此
我正在使用geotools库来提取位置信息。这样我就得到了一个类型的对象 class com.vividsolutions.jts.geom.MultiPolygon 我现在想通过 jdbc 连接将此
我将 leaflet.js 与 postgis (postgres) 一起使用。我想将多面体转换为几何图形以存储在数据库中。但是我收到了这个错误: An error occurred when exe
我有一个表 Town,其列 TownBoundary 包含相关城镇的多边形(geography 数据类型)。 对于每个城镇,我都会获得生成 KML(XML) 文件所需的多边形数据,例如: sqlg =
我有一个世界国家数据集,想在本初子午线上拆分它,并将数据重新集中在太平洋上。 我正在尝试使用简单功能 (sf) 来执行此操作,但遇到了一个我无法解决的对象类型问题。 为了拆分数据,我尝试了以下操作:
我有一个由大约 100 个条目(多多边形几何图形)组成的 cartoDB 数据集,我使用 cartodb.js API 检索该数据集。单击区域时更改给定条目(倍数)的不透明度的最佳方法(性能方面)是什
所以这是我第一次做一个涉及 map 和图层的项目, map 上有很多点和很多多边形。 我倾向于为点和多边形创建单独的表,然后在它们与图层表之间创建多对多关系。如果这样做,我最终会得到 5 个表:poi
我有以下MultiPolygon: MULTIPOLYGON ( ( (10.8849956 49.8901705, 10.8849507 49.8902499, 10.884969 49.89025
我需要将PostgreSQL的几何(MultiPolygon)类型变量存储到java变量中这是因为我尝试将几何列添加到非空间表以使用 map 服务器查询 map 我试图将它存储在一个字符串中,这导致了
我正在从 Trimble 导入一些 OSM 数据到 PostGIS 数据库中,将其作为 Django 应用程序的一部分进行处理。这适用于点和线,但我正在努力处理多边形。 导入似乎工作正常: shp2p
有没有人用PHP解析过MySql中的Polygon/Multipolygon几何数据?我是 MySQL 空间函数的新手。请帮我从 MySQL 中的多面体中获取经纬度点。 我有一个表格,其中有一个类型为
我有两个 GeoDataFrame。一个是爱荷华州,另一个是北美 future 72 小时内预料到的降雨。我想创建一个覆盖爱荷华州的降雨预报的 GeoDataFrame。但是我得到一个错误。 stat
我正在从不同来源收集位置信息并将所有内容存储在 MongoDb 集合中。除了具有单一纬度/经度坐标的点位置外,我还存储区域。 现在,一个数据给我的位置信息为 GeometryCollection,但所
如何在 NodeJs sequelize 中创建具有多多边形数据类型的表字段? myfield: { type: ?????, allowNull: true } MySQL表结构是-
我是一名优秀的程序员,十分优秀!