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;
}
}
}
}