Я читаю набор данных, содержащих большое количество многополигонов. Я использую Geotools, и я хотел бы сохранить этот список в таблице базы данных mysql.Geotools MultiPolygon to DB и обратно
Я не знаю, как эффективно сохранять форму и иметь возможность воссоздать объект multipolygon.
Если я получу координаты мультиполя, тогда я получаю массив, содержащий значения всех вершин для этой геометрии (в случае, когда геометрия является составной, массив содержит все вершины для компонентов, в порядок, в котором компоненты встречаются в геометрии), но я не знаю, как воссоздать новый мультиполигон с этими координатами.
Подпишитесь ниже, что я получил.
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());
}
}
В настоящее время из MultiPolygon я знаю, как получить полигон обратно (потому что я просто хранить координаты, и я использую их, чтобы создать полигон), но я не знаю, что делать, чтобы сохранить и извлечение мультиполигона. В целом, оптимальное решение будет работать для любой геометрии:
синтаксического анализа геометрии OBJ -> магазин геометрии к БД (с соответствующим ID) -> (спустя некоторое время ...) -> получить информацию о геометрии (по ID) -> построить новую геометрию 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
, я хотел бы получить связанную информацию о фигуре(), а затем построить геометрию.
Спасибо! Я изучаю это, но я, кажется, не нахожу то, что мне нужно. DataStore больше подходит для получения информации, а не для вставки информации в данную таблицу mysql. Я отредактирую вопрос, добавив более подробную информацию. – user1472709