- package osm.jp.postgis;
-
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.LineNumberReader;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.SQLException;
- import java.sql.SQLSyntaxErrorException;
- import java.util.ArrayList;
- import jp.co.areaweb.tools.csv.CsvRecord;
- import jp.co.areaweb.tools.database.DatabaseTool;
- import static osm.jp.postgis.ToPostgis.printMark;
-
- /**
- * CSVファイルの内容をPostGIS.db.tableに書き戻す
- *
- * @author yuu
- *
- */
- public class Postgis implements AutoCloseable
- {
- /**
- *
- * $ java -cp .:osmCoverage.jar:hayashi.jar:postgresql.jar \
- * osm.jp.postgis.Postgis ./share
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- File dir = new File(args[0]);
- try (Postgis db = new Postgis(dir)) {
- db.initTableAll();
- db.importCsvAll();
- }
- }
-
- TableInfo[] tables;
- Connection con = null;
- File workspaceDir;
-
- class TableInfo {
- String tableName;
- String csvPath;
-
- TableInfo(String tableName, String csvPath) {
- this.tableName = tableName;
- this.csvPath = csvPath;
- }
- }
-
- public Postgis(File workspace) throws ClassNotFoundException, SQLException, IOException {
- if (workspace == null) {
- this.workspaceDir = new File(".");
- }
- else {
- this.workspaceDir = workspace;
- }
- ArrayList<TableInfo> list = new ArrayList<>();
- list.add(new TableInfo("t_busstop", "GML_BUSSTOP/t_busstop.csv"));
- list.add(new TableInfo("t_fuel", "GML_FUEL/t_fuel.csv"));
- list.add(new TableInfo("t_police", "GML_POLICE/t_police.csv"));
- list.add(new TableInfo("t_postoffice", "GML_POSTOFFICE/t_postoffice.csv"));
- this.tables = list.toArray(new TableInfo[list.size()]);
-
- con = DatabaseTool.openDb("gisdb");
- }
-
- @Override
- public void close() throws Exception {
- if (con != null) {
- DatabaseTool.closeDb(con);
- }
- }
-
- public void initTableAll() throws Exception {
- for (TableInfo tableInfo : tables) {
- initTable(tableInfo.tableName);
- }
- }
-
- public void initTable(String tableName) throws Exception {
- sql("DROP TABLE IF EXISTS "+ tableName +" CASCADE;");
- sql("CREATE TABLE "+ tableName
- +" ("
- + "gid SERIAL PRIMARY KEY, "
- + "gmlid varchar(24), "
- + "idref varchar(24), "
- + "fixed integer, "
- + "area integer, "
- + "code integer, "
- + "geom GEOMETRY(POINT, 4612)"
- + ");");
- sql("CREATE INDEX ix_"+ tableName +"_geom ON "+ tableName +" USING GiST (geom);");
- }
-
- public void importCsvAll() throws Exception {
- for (TableInfo info : this.tables) {
- importCsv(info);
- }
- }
-
- public void importCsv(TableInfo info) throws Exception {
- String charsetName = "UTF-8";
- File csvFile = new File(this.workspaceDir, info.csvPath);
- try (LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(csvFile), charsetName))) {
- String line;
- ArrayList<String> header = new ArrayList<>();
- while ((line = reader.readLine()) != null) {
- if (line.trim().length() == 0) {
- continue;
- }
-
- CsvRecord record = new CsvRecord();
- record.analizeRecord(line);
- if (header.isEmpty()) {
- for (String str : record) {
- header.add(str);
- }
- }
- else {
- toInsert(info.tableName, header, record);
- }
- }
- }
- }
-
- public void toInsert(String tableName, ArrayList<String> header, CsvRecord record)
- throws Exception
- {
- String gmlidStr = getStr(header, record, "gmlid");
- String idrefStr = getStr(header, record, "idref");
- int area = getInt(header, record, "area");
- int fixed = getInt(header, record, "fixed");
- int code = getInt(header, record, "code");
- String latStr = record.get(header.indexOf("lat"));
- String lonStr = record.get(header.indexOf("lon"));
- String latlon = String.format(
- "ST_GeomFromText('POINT(%.7f %.7f)',4612)",
- Double.parseDouble(lonStr),
- Double.parseDouble(latStr)
- );
- String sqlStr = "INSERT INTO "+ tableName
- +" (gmlid,idref,area,fixed,code,geom) "
- + "VALUES (?,?,?,?,?, "+ latlon +")";
- try (PreparedStatement ps = this.con.prepareStatement(sqlStr)) {
- printMark();
- ps.setString(1, gmlidStr); // gmlid
- ps.setString(2, idrefStr); // idref
- ps.setInt(3, area); // area
- ps.setInt(4, fixed); // fixed
- ps.setInt(5, code); // code
- ps.executeUpdate();
- }
- catch (SQLSyntaxErrorException e) {
- System.out.println("107:"+ e.toString());
- if (!(e.toString().startsWith("java.sql.SQLSyntaxErrorException: user lacks privilege or object not found:"))) {
- throw e;
- }
- }
- }
-
- String getStr(ArrayList<String> header, CsvRecord record, String key) {
- int i = header.indexOf(key);
- if (i < 0) {
- return "";
- }
- else {
- return record.get(i);
- }
- }
-
- int getInt(ArrayList<String> header, CsvRecord record, String key) {
- int i = header.indexOf(key);
- if (i < 0) {
- return 0;
- }
- else {
- return Integer.parseInt(record.get(i));
- }
- }
-
- public void sql(String sql) throws SQLException {
- System.out.println(sql);
- try (PreparedStatement ps = this.con.prepareStatement(sql)) {
- ps.executeUpdate();
- }
- catch (SQLSyntaxErrorException e) {
- System.out.println("107:"+ e.toString());
- if (!(e.toString().startsWith("java.sql.SQLSyntaxErrorException: user lacks privilege or object not found:"))) {
- throw e;
- }
- }
- }
- }