package osm.jp.postgis;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.xml.parsers.ParserConfigurationException;
import jp.co.areaweb.tools.database.DatabaseTool;
import org.xml.sax.SAXException;
import osm.jp.api.Coverage;
import osm.jp.api.HttpPOST;
/**
* 国土数値情報から読み取ったデータをPostGISへインサートする。
* 出力db名: "gisdb.properties"
* テーブル名: t_POSTOFFICE
* インデックス: ix_t_POSTOFFICE_geom
* gid PostGISの識別ID
* idstr 国土数値情報のノードID
* fixed OSMのNodeが周辺に存在するかどうか、存在しない場合は0,存在する場合はそのScoreの合計。
* area 都道府県コード
* geom PostGIS形式の位置情報(4612:)
* @author yuu
*
*/
public class ToPostgis {
String tableName = null;
public PostgisItems items = null;
/**
* コンストラクタ
* @param tableName 出力先データベーステーブル
*/
public ToPostgis(String tableName) {
this.tableName = tableName;
this.items = new PostgisItems();
items.add(new PostgisItem("gmlid", "gmlid"));
items.add(new PostgisItem("idref", "idref"));
items.add(new PostgisItem("area", "area"));
items.add(new PostgisItem("fixed", "fixed1"));
items.add(new PostgisItem("code", "code"));
}
public ToPostgis(String tableName, PostgisItems items) {
this(tableName);
this.items = items;
}
/**
* HSQLDBからPOSTGISへ
*
* @param toPropertiy
* @throws Exception
*/
public void transport(String toPropertiy) throws Exception {
try (Connection conHsql = DatabaseTool.openDb(Coverage.DB_PORP_LOCALDB);
Connection conPost = DatabaseTool.openDb(toPropertiy))
{
transportNew(conHsql, conPost);
toInsert(conHsql, conPost);
}
}
/**
* HSQLDB: "SELECT idref,area,fixed,lat,lon FROM POSTOFFICE"
* POSTGIS "insert into t_POSTOFFICE(idref,fixed,area,geom) VALUES('n000001',0,0, ST_GeomFromText('POINT(136.9695284611471 35.10300377075564)', 4612));"
*
* @param conHsql
* @param conPost
* @throws java.io.FileNotFoundException
* @throws java.lang.ClassNotFoundException
* @throws java.sql.SQLException
* @throws java.io.IOException
* @throws javax.xml.parsers.ParserConfigurationException
* @throws org.xml.sax.SAXException
*/
/*
<pre>{@code
CREATE TABLE public.t_TABLENAME
(
gid integer NOT NULL DEFAULT nextval('t_TABLENAME_gid_seq'::regclass),
gmlid text,
idref text,
name text,
fixed integer,
area integer,
code integer,
geom geometry(Point,4612),
CONSTRAINT t_TABLENAME_pkey PRIMARY KEY (gid)
)
WITH (OIDS=FALSE);
ALTER TABLE public.t_TABLENAME
OWNER TO postgres;
CREATE INDEX ix_TABLENAME_geom ON public.t_TABLENAME USING gist (geom);
GRANT SELECT ON t_fuel TO gisuser;
}</pre>
*/
public void transportNew(Connection conHsql, Connection conPost) throws FileNotFoundException, ClassNotFoundException, SQLException, IOException, ParserConfigurationException, SAXException {
HttpPOST posgre = new HttpPOST(conPost, null);
posgre.sql("DROP TABLE IF EXISTS t_"+ tableName +" CASCADE;");
posgre.sql("CREATE TABLE t_"+ tableName
+" ("
+ "gid SERIAL PRIMARY KEY, "
+ "gmlid varchar(24), "
+ "idref varchar(24), "
+ "fixed integer, "
+ "area integer, "
+ "code integer, "
+ "geom GEOMETRY(POINT, 4612)"
+ ");");
posgre.sql("CREATE INDEX ix_"+ tableName +"_geom ON t_"+ tableName +" USING GiST (geom);");
posgre.sql("GRANT SELECT ON t_"+ tableName +" TO gisuser;");
}
public void toInsert (Connection conHsql, Connection conPost)
throws FileNotFoundException, ClassNotFoundException, SQLException, IOException, ParserConfigurationException, SAXException
{
String sql = items.getSqlStr(tableName);
try (PreparedStatement ps1 = conHsql.prepareStatement(sql);
ResultSet rset1 = ps1.executeQuery()) {
while (rset1.next()) {
items.setResuit(rset1);
String latlon = String.format(
"ST_GeomFromText('POINT(%.7f %.7f)',4612)",
items.lon,
items.lat
);
String sqlStr = "INSERT INTO t_"+ tableName
+" (gmlid,idref,fixed,area,code,geom) "
+ "VALUES (?,?,?,?,?, "+ latlon +")";
try (PreparedStatement ps = conPost.prepareStatement(sqlStr)) {
printMark();
ps.setString(1, items.gmlid);
ps.setString(2, items.idref);
ps.setInt(3, items.fixed);
ps.setInt(4, items.area);
ps.setInt(5, items.code);
ps.executeUpdate();
}
}
}
}
/**
*
* @param csvFile
* @param gisdb
* @throws FileNotFoundException
* @throws ClassNotFoundException
* @throws SQLException
* @throws IOException
* @throws ParserConfigurationException
* @throws SAXException
*/
public void toCsv (File csvFile, String gisdb)
throws FileNotFoundException, ClassNotFoundException, SQLException, IOException, ParserConfigurationException, SAXException
{
try (Connection conPost = DatabaseTool.openDb(gisdb);
BufferedWriter ow = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "UTF-8")))
{
String header = items.getCsvHeader();
ow.write(header);
ow.newLine();
String sql = items.getPostSqlStr(tableName);
PreparedStatement ps8 = conPost.prepareStatement(sql);
try (ResultSet rset8 = ps8.executeQuery()) {
while (rset8.next()) {
items.setPostResuit(rset8);
String osm_node = items.getValue();
System.out.println(osm_node);
ow.write(osm_node);
ow.newLine();
}
}
ow.flush();
}
}
public static int outCnt = 0;
public static void printMark() {
outCnt++;
if ((outCnt % 10) == 1) {
System.out.print(".");
if (outCnt >= 800) {
outCnt = 0;
System.out.println();
}
}
}
}