diff --git a/src/osm/jp/api/Osmdb.java b/src/osm/jp/api/Osmdb.java index 0bb9e84..59c1d0f 100644 --- a/src/osm/jp/api/Osmdb.java +++ b/src/osm/jp/api/Osmdb.java @@ -1,6 +1,5 @@ package osm.jp.api; -import java.net.*; import java.io.*; import java.sql.Connection; import java.sql.PreparedStatement; @@ -8,6 +7,7 @@ import java.sql.SQLException; import java.sql.SQLIntegrityConstraintViolationException; import java.sql.SQLSyntaxErrorException; +import jp.co.areaweb.tools.csv.CsvRecord; import jp.co.areaweb.tools.database.DatabaseTool; import org.hsqldb.HsqlException; import org.w3c.dom.NamedNodeMap; @@ -76,50 +76,13 @@ } public static final int POINT_NO = 0; // 評価ポイント無し→ score=50 - public static final int POINT_FIXME = 1; // 評価ポイント無し→ score=50 + public static final int POINT_FIXME = 1; // 評価ポイント|!(fixme=null) → score=1 public static final int POINT_BRAND = 2; // 評価ポイント|brand=null → score=1 public static final int POINT_NAME = 4; // 評価ポイント|name=null → score=1 + public static final int POINT_BUS = 8; // 評価ポイント|!(bus=yes) → score=0 - /** - * File(HttpPOST.EXIST_FILE)を読み取って、データベースに反映させる。
- * その際に、OSMノードを評価し、scoreを算定する - * - * @param hsqldb 反映先のデータベースコネクタ(HSQLDB) - * @param sqlWhere POI条件 - * @param point 評価ポイント[POINT_NO|POINT_BRAND|POINT_NAME] 1: 'brand' 2:'name' - * @throws Exception エラー - */ - public void readExisting(Connection hsqldb, String sqlWhere, int point) throws Exception { - Connection osmdb = null; - long counter = 0L; - try { - osmdb = DatabaseTool.openDb("osmdb"); - - PreparedStatement ps1 = osmdb.prepareStatement("select osm_id,brand,disused,name,ST_Y(ST_Transform(way,4326)) as lat,ST_X(ST_Transform(way,4326)) as lon from planet_osm_point " + sqlWhere); - try (ResultSet rset1 = ps1.executeQuery()) { - while (rset1.next()) { - counter += importExistingNode(hsqldb, rset1, point); - } - } - - PreparedStatement ps2 = osmdb.prepareStatement("select osm_id,brand,disused,name,ST_Y(ST_Transform(ST_Centroid(way),4326)) as lat,ST_X(ST_Transform(ST_Centroid(way),4326)) as lon from planet_osm_polygon " + sqlWhere); - try (ResultSet rset2 = ps2.executeQuery()) { - while (rset2.next()) { - counter += importExistingNode(hsqldb, rset2, point); - } - } - System.out.println("Exists Node count = " + counter); - } - finally { - DatabaseTool.closeDb(osmdb); - } - - //readAreaNodes(hsqldb, root); - - } - - int importExistingNode(Connection hsqldb, ResultSet rset, int point) throws IOException, SQLException { + public int importExistingNode(Connection hsqldb, Connection osmdb, ResultSet rset, int point) throws IOException, SQLException { String osmidStr = rset.getString("osm_id"); String latStr = rset.getString("lat"); @@ -135,27 +98,76 @@ if (((point & POINT_NAME) != 0) && isNull(nameStr)) { score = 1; } - if (((point & POINT_FIXME) != 0) && !isNull(fixmeStr)) { - score = 1; + + boolean fixme = false; + boolean busYes = false; + if (((point & (POINT_FIXME | POINT_BUS)) != 0)) { + PreparedStatement ps8 = osmdb.prepareStatement("SELECT * FROM planet_osm_nodes where id='"+ osmidStr +"'"); + try (ResultSet rset8 = ps8.executeQuery()) { + while (rset8.next()) { + String tags = rset8.getString("tags"); + if (tags != null) { + tags = tags.substring(1); + tags = tags.substring(0, tags.length()-1); + CsvRecord csv = new CsvRecord(); + csv.analizeRecord(tags); + + boolean key = true; + boolean bus = false; + for (String str : csv) { + if (key) { + if (str.startsWith("fixme")) { + fixme = true; + } + if (str.equals("bus")) { + bus = true; + } + key = false; + } + else { + if (bus) { + if (str.equals("yes")) { + busYes = true; + } + bus = false; + } + key = true; + } + } + + System.out.println(tags); + } + } + } + + if (((point & POINT_FIXME) != 0) && fixme) { + score = 1; + } + if (((point & POINT_BUS) != 0) && !busYes) { + score = 0; + } + } + + if (score > 0) { + // idref と brandStr をデータベースに格納する + System.out.println("INSERT INTO "+ TABLE_NAME +" (idref,lat,lon,score,name) VALUES ("+ osmidStr +","+ latStr +","+ lonStr+","+ Integer.toString(score) +",'"+ nameStr +"')N"); + try (PreparedStatement ps5 = hsqldb.prepareStatement("INSERT INTO "+ TABLE_NAME +" (idref,lat,lon,score,name) VALUES (?,?,?,?,?)")) { + ps5.setString(1, osmidStr); + ps5.setDouble(2, Double.parseDouble(latStr)); + ps5.setDouble(3, Double.parseDouble(lonStr)); + ps5.setInt(4, score); + ps5.setString(5, nameStr); + ps5.executeUpdate(); + return 1; + } + catch (HsqlException | SQLIntegrityConstraintViolationException e) { + // integrity constraint violation: unique constraint or index violation; SYS_PK_10069 table: FUEL_EXIST + // [HsqlException]は、無視する + // integrity constraint violation: unique constraint or index violation; SYS_PK_10069 table: FUEL_EXIST + // [SQLIntegrityConstraintViolationException]は、無視する + } } - // idref と brandStr をデータベースに格納する - System.out.println("INSERT INTO "+ TABLE_NAME +" (idref,lat,lon,score,name) VALUES ("+ osmidStr +","+ latStr +","+ lonStr+","+ Integer.toString(score) +",'"+ nameStr +"')N"); - try (PreparedStatement ps5 = hsqldb.prepareStatement("INSERT INTO "+ TABLE_NAME +" (idref,lat,lon,score,name) VALUES (?,?,?,?,?)")) { - ps5.setString(1, osmidStr); - ps5.setDouble(2, Double.parseDouble(latStr)); - ps5.setDouble(3, Double.parseDouble(lonStr)); - ps5.setInt(4, score); - ps5.setString(5, nameStr); - ps5.executeUpdate(); - return 1; - } - catch (HsqlException | SQLIntegrityConstraintViolationException e) { - // integrity constraint violation: unique constraint or index violation; SYS_PK_10069 table: FUEL_EXIST - // [HsqlException]は、無視する - // integrity constraint violation: unique constraint or index violation; SYS_PK_10069 table: FUEL_EXIST - // [SQLIntegrityConstraintViolationException]は、無視する - } return 0; } @@ -163,10 +175,7 @@ if (vstr == null) { return true; } - if (vstr.trim().length() < 1) { - return true; - } - return false; + return (vstr.trim().length() < 1); } int readAreaNodes(Connection con, Node node) throws IOException, SQLException { diff --git a/src/osm/jp/coverage/busstop/DbExistBusstop.java b/src/osm/jp/coverage/busstop/DbExistBusstop.java index 188310a..eed4a9a 100644 --- a/src/osm/jp/coverage/busstop/DbExistBusstop.java +++ b/src/osm/jp/coverage/busstop/DbExistBusstop.java @@ -1,8 +1,5 @@ package osm.jp.coverage.busstop; -import osm.jp.api.HttpPOST; -import osm.jp.api.Japan; - import javax.xml.parsers.*; import javax.xml.transform.TransformerException; import org.xml.sax.*; @@ -11,24 +8,14 @@ import java.net.MalformedURLException; import java.net.ProtocolException; import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; -import java.text.SimpleDateFormat; import jp.co.areaweb.tools.database.*; +import osm.jp.api.Osmdb; -public class DbExistBusstop extends HttpPOST { - - String filter = ""; - String urlStr = ""; - - public static final boolean DB_INIT = false; - public static boolean DROP = false; - - // 近くのバス停を探す範囲(バス停を中心としたNEER×2m四方の領域 - static boolean update = false; // '-update'オプション postgisデータの更新を行う - static boolean noget = false; // '-noget'オプション OSM既存データのGETを行わない - - public static SimpleDateFormat timeStampFmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); +public class DbExistBusstop extends Osmdb { /** * 既存のOSMバス停を読み込む @@ -49,12 +36,12 @@ * @throws TransformerException * @throws SAXException * @throws ParserConfigurationException */ - public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, SQLException, IOException, ParserConfigurationException, SAXException, TransformerException + public static void main(String[] args) throws Exception { Connection conHsql = null; try { conHsql = DatabaseTool.openDb("database"); - HttpPOST.create(conHsql); + create(conHsql); /** * 既存のOSMバス停を読み込む @@ -95,24 +82,84 @@ * @throws ParserConfigurationException * @throws SAXException */ - public void getJapanCapabilities(Connection conHsql) throws MalformedURLException, ProtocolException, IOException, ClassNotFoundException, SQLException, ParserConfigurationException, SAXException { - for (Japan area : Japan.all) { - StringBuilder queryText = new StringBuilder(); - queryText.append("("); - queryText.append(" node[highway=bus_stop]("+ area.getSWNE() +");"); - queryText.append(" node[highway=\"disused:bus_stop\"]("+ area.getSWNE() +");"); - queryText.append(" node[public_transport=platform][bus=yes]("+ area.getSWNE() +");"); - queryText.append(" node[public_transport=stop_position][bus=yes]("+ area.getSWNE() +");"); - queryText.append(" node[amenity=bus_station]("+ area.getSWNE() +");"); - queryText.append(" (way[amenity=bus_station]("+ area.getSWNE() +");>;);"); - queryText.append(");"); - queryText.append("out;"); - HttpPOST.getQuery(queryText.toString()); + public void getJapanCapabilities(Connection conHsql) throws Exception { + // 通常 → 50ポイント + // NAMEなし → 1ポイント + // FIXMEあり → 1ポイント + readExisting(conHsql, null, POINT_NAME | POINT_FIXME); + } + + // ノード: 厚木ナイロン (1995040609) 場所: 35.4433312, 139.3932098 public_transport=stop_position,bus=yes + // ノード: 海老名高校前 (2043102034) 場所: 35.4435042, 139.3878934 highway=bus_stop + // ノード: 4940018338 場所: 35.5909251, 139.1498642 highway=bus_stop, name=null, bus=null,public_transport=platform + // ノード: 八幡前 (3152604023) 場所: 33.9808001, 133.3123441 fixme有り + + /** + * File(HttpPOST.EXIST_FILE)を読み取って、データベースに反映させる。
+ * その際に、OSMノードを評価し、scoreを算定する + * + * @param hsqldb 反映先のデータベースコネクタ(HSQLDB) + * @param sqlWhere POI条件 + * @param point 評価ポイント[POINT_NO|POINT_BRAND|POINT_NAME] 1: 'brand' 2:'name' + * @throws Exception エラー + */ + public void readExisting(Connection hsqldb, String sqlWhere, int point) throws Exception { + Connection osmdb = null; + long counter = 0L; + try { + osmdb = DatabaseTool.openDb("osmdb"); - // 通常 → 50ポイント - // NAMEなし → 1ポイント - // FIXMEあり → 1ポイント - readExistingFile(conHsql, HttpPOST.POINT_NAME | HttpPOST.POINT_FIXME); + String sql = "select osm_id,brand,disused,name"; + + StringBuilder whereText0 = new StringBuilder(); + whereText0.append("where (highway='disused:bus_stop'"); + whereText0.append(")"); + PreparedStatement ps0 = osmdb.prepareStatement(sql + ",ST_Y(ST_Transform(way,4326)) as lat,ST_X(ST_Transform(way,4326)) as lon from planet_osm_point " + whereText0.toString()); + try (ResultSet rset1 = ps0.executeQuery()) { + while (rset1.next()) { + counter += importExistingNode(hsqldb, osmdb, rset1, 0); + } + } + + StringBuilder whereText1 = new StringBuilder(); + whereText1.append("where (highway='bus_stop'"); + whereText1.append(" or amenity='bus_station'"); + whereText1.append(")"); + PreparedStatement ps1 = osmdb.prepareStatement(sql + ",ST_Y(ST_Transform(way,4326)) as lat,ST_X(ST_Transform(way,4326)) as lon from planet_osm_point " + whereText1.toString()); + try (ResultSet rset1 = ps1.executeQuery()) { + while (rset1.next()) { + counter += importExistingNode(hsqldb, osmdb, rset1, point); + } + } + + StringBuilder whereText = new StringBuilder(); + whereText.append("where (public_transport='platform'"); + whereText.append(" or public_transport='stop_position'"); + whereText.append(")"); + PreparedStatement ps = osmdb.prepareStatement(sql + ",ST_Y(ST_Transform(way,4326)) as lat,ST_X(ST_Transform(way,4326)) as lon from planet_osm_point " + whereText.toString()); + try (ResultSet rset1 = ps.executeQuery()) { + while (rset1.next()) { + counter += importExistingNode(hsqldb, osmdb, rset1, point | POINT_BUS); + } + } + + StringBuilder whereText2 = new StringBuilder(); + whereText2.append("where (amenity='bus_station'"); + whereText2.append(")"); + PreparedStatement ps2 = osmdb.prepareStatement(sql +",ST_Y(ST_Transform(ST_Centroid(way),4326)) as lat,ST_X(ST_Transform(ST_Centroid(way),4326)) as lon from planet_osm_polygon " + whereText2.toString()); + try (ResultSet rset2 = ps2.executeQuery()) { + while (rset2.next()) { + counter += importExistingNode(hsqldb, osmdb, rset2, point); + } + } + + System.out.println("Exists Node count = " + counter); } + finally { + DatabaseTool.closeDb(osmdb); + } + + //readAreaNodes(hsqldb, root); + } } \ No newline at end of file diff --git a/src/osm/jp/coverage/fuel/DbExist.java b/src/osm/jp/coverage/fuel/DbExist.java index a7cd4ef..b5e8fa6 100644 --- a/src/osm/jp/coverage/fuel/DbExist.java +++ b/src/osm/jp/coverage/fuel/DbExist.java @@ -124,4 +124,39 @@ } } + /** + * File(HttpPOST.EXIST_FILE)を読み取って、データベースに反映させる。
+ * その際に、OSMノードを評価し、scoreを算定する + * + * @param hsqldb 反映先のデータベースコネクタ(HSQLDB) + * @param sqlWhere POI条件 + * @param point 評価ポイント[POINT_NO|POINT_BRAND|POINT_NAME] 1: 'brand' 2:'name' + * @throws Exception エラー + */ + public void readExisting(Connection hsqldb, String sqlWhere, int point) throws Exception { + Connection osmdb = null; + long counter = 0L; + try { + osmdb = DatabaseTool.openDb("osmdb"); + + PreparedStatement ps1 = osmdb.prepareStatement("select osm_id,brand,disused,name,ST_Y(ST_Transform(way,4326)) as lat,ST_X(ST_Transform(way,4326)) as lon from planet_osm_point " + sqlWhere); + try (ResultSet rset1 = ps1.executeQuery()) { + while (rset1.next()) { + counter += importExistingNode(hsqldb, osmdb, rset1, point); + } + } + + PreparedStatement ps2 = osmdb.prepareStatement("select osm_id,brand,disused,name,ST_Y(ST_Transform(ST_Centroid(way),4326)) as lat,ST_X(ST_Transform(ST_Centroid(way),4326)) as lon from planet_osm_polygon " + sqlWhere); + try (ResultSet rset2 = ps2.executeQuery()) { + while (rset2.next()) { + counter += importExistingNode(hsqldb, osmdb, rset2, point); + } + } + + System.out.println("Exists Node count = " + counter); + } + finally { + DatabaseTool.closeDb(osmdb); + } + } } \ No newline at end of file diff --git a/test/osm/jp/coverage/busstop/DbExistBusstopTest.java b/test/osm/jp/coverage/busstop/DbExistBusstopTest.java new file mode 100644 index 0000000..9734a1e --- /dev/null +++ b/test/osm/jp/coverage/busstop/DbExistBusstopTest.java @@ -0,0 +1,224 @@ +package osm.jp.coverage.busstop; + +import java.io.File; +import java.io.IOException; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.logging.Level; +import java.util.logging.Logger; +import jp.co.areaweb.tools.database.DatabaseTool; +import static org.hamcrest.CoreMatchers.is; +import org.junit.*; +import static org.junit.Assert.*; +import static osm.jp.api.Osmdb.create; + +/** + * + * @author yuu + */ +public class DbExistBusstopTest { + @Before + public void setUp() throws Exception { + File dir = new File("database"); + if (dir.exists()) { + if (dir.isDirectory()) { + dir.deleteOnExit(); + } + else { + throw new Exception("'database' is not directory."); + } + } + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test01_hsqldbの生成確認() { + Connection con = null; + try { + // DB.tableを作成 + con = DatabaseTool.openDb("database"); + create(con); + } + catch (ClassNotFoundException ex) { + fail(); + } catch (SQLException ex) { + fail(); + } catch (IOException ex) { + fail(); + } finally { + if (con != null) { + DatabaseTool.closeDb(con); + } + } + + File dir = new File("database"); + assertTrue(dir.exists()); + assertTrue(dir.isDirectory()); + + Connection hsqldb = null; + try { + hsqldb = DatabaseTool.openDb("database"); + + PreparedStatement ps8 = hsqldb.prepareStatement("SELECT count(*) FROM AREA_NODE"); + try (ResultSet rset8 = ps8.executeQuery()) { + if (rset8.next()) { + long cnt = rset8.getLong(1); + assertThat(Long.toString(cnt), is("0")); + } + else { + fail(); + } + } + + PreparedStatement ps1 = hsqldb.prepareStatement("SELECT count(*) FROM OSM_EXIST"); + try (ResultSet rset1 = ps1.executeQuery()) { + if (rset1.next()) { + long cnt = rset1.getLong(1); + assertThat(Long.toString(cnt), is("0")); + } + else { + fail(); + } + } + + } catch (ClassNotFoundException ex) { + Logger.getLogger(DbExistBusstopTest.class.getName()).log(Level.SEVERE, null, ex); + } catch (SQLException ex) { + Logger.getLogger(DbExistBusstopTest.class.getName()).log(Level.SEVERE, null, ex); + } catch (IOException ex) { + Logger.getLogger(DbExistBusstopTest.class.getName()).log(Level.SEVERE, null, ex); + } finally { + DatabaseTool.closeDb(hsqldb); + } + } + + @Test + public void test02_busstop() { + try { + String[] args = new String[0]; + DbExistBusstop.main(args); + } + catch (Exception ex) { + fail(ex.toString()); + } + + File dir = new File("database"); + assertTrue(dir.exists()); + assertTrue(dir.isDirectory()); + + Connection hsqldb = null; + try { + hsqldb = DatabaseTool.openDb("database"); + + PreparedStatement ps1 = hsqldb.prepareStatement("SELECT count(*) FROM OSM_EXIST"); + try (ResultSet rset1 = ps1.executeQuery()) { + if (rset1.next()) { + long cnt = rset1.getLong(1); + assertThat((cnt > 0), is(true)); + } + else { + fail(); + } + } + + // ノード: 八幡前 (3152604023) 場所: 33.9808001, 133.3123441 fixme有り + ps1 = hsqldb.prepareStatement("SELECT score,name,lat,lon FROM OSM_EXIST where idref='3152604023'"); + try (ResultSet rset1 = ps1.executeQuery()) { + if (rset1.next()) { + // fixme有り + assertThat(rset1.getInt("score"), is(1)); + assertThat(checkRenge(rset1, "33.9808001", "133.3123441"), is(true)); + } + else { + fail(); + } + } + + // ノード: 4940018338 場所: 35.5909251, 139.1498642 highway=bus_stop, name=null, bus=null,public_transport=platform + ps1 = hsqldb.prepareStatement("SELECT score,name,lat,lon FROM OSM_EXIST where idref='4940018338'"); + try (ResultSet rset1 = ps1.executeQuery()) { + if (rset1.next()) { + // nameなし + assertThat(rset1.getInt("score"), is(1)); + assertThat(checkRenge(rset1, "35.5909251", "139.1498642"), is(true)); + } + else { + fail(); + } + } + + // ノード: 海老名高校前 (2043102034) 場所: 35.4435042, 139.3878934 highway=bus_stop + ps1 = hsqldb.prepareStatement("SELECT score,name,lat,lon FROM OSM_EXIST where idref='2043102034'"); + try (ResultSet rset1 = ps1.executeQuery()) { + if (rset1.next()) { + assertThat(rset1.getInt("score"), is(50)); + assertThat(checkRenge(rset1, "35.4435042", "139.3878934"), is(true)); + } + else { + fail(); + } + } + + // ノード: 厚木ナイロン (1995040609) 場所: 35.4433312, 139.3932098 public_transport=stop_position,bus=yes + ps1 = hsqldb.prepareStatement("SELECT score,name,lat,lon FROM OSM_EXIST where idref='1995040609'"); + try (ResultSet rset1 = ps1.executeQuery()) { + if (rset1.next()) { + assertThat(rset1.getInt("score"), is(50)); + assertThat(checkRenge(rset1, "35.4433312", "139.3932098"), is(true)); + } + else { + fail(); + } + } + + // ウェイ: 国分寺台第12 (154659062) bus_station + ps1 = hsqldb.prepareStatement("SELECT score,name,lat,lon FROM OSM_EXIST where idref='154659062'"); + try (ResultSet rset1 = ps1.executeQuery()) { + if (rset1.next()) { + assertThat(rset1.getInt("score"), is(50)); + } + else { + fail(); + } + } + + } catch (ClassNotFoundException ex) { + Logger.getLogger(DbExistBusstopTest.class.getName()).log(Level.SEVERE, null, ex); + } catch (SQLException ex) { + Logger.getLogger(DbExistBusstopTest.class.getName()).log(Level.SEVERE, null, ex); + } catch (IOException ex) { + Logger.getLogger(DbExistBusstopTest.class.getName()).log(Level.SEVERE, null, ex); + } finally { + DatabaseTool.closeDb(hsqldb); + } + } + + boolean checkRenge(ResultSet rset, String latStr, String lonStr) throws SQLException { + if (checkRenge(rset.getDouble("lat"), latStr)) { + if (checkRenge(rset.getDouble("lon"), lonStr)) { + return true; + } + } + return false; + } + + boolean checkRenge(double d1, String str) throws SQLException { + double base = Double.parseDouble(str); + double up = d1 + 0.00000009D; + double down = d1 - 0.00000009D; + boolean ret = true; + if (Double.compare(base, up) > 0) { + ret = false; + } + if (Double.compare(base, down) < 0) { + ret = false; + } + System.out.println("d1: "+ d1 +" : "+ str +" --> "+ (ret ? "IN" : "out")); + return ret; + } +} diff --git a/test/osm/jp/coverage/fuel/DbExistTest.java b/test/osm/jp/coverage/fuel/DbExistTest.java index e661d11..ad851f4 100644 --- a/test/osm/jp/coverage/fuel/DbExistTest.java +++ b/test/osm/jp/coverage/fuel/DbExistTest.java @@ -104,7 +104,7 @@ DbExist.main(args); } catch (Exception ex) { - fail(); + fail(ex.toString()); } File dir = new File("database");