• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Aucun tag

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

巨大森林を分割する


Commit MetaInfo

Révision59ed10ba0317163c54d08d1ae244306749a16d55 (tree)
l'heure2013-12-21 15:14:49
Auteurhayashi <hayashi.yuu@gmai...>
Commiterhayashi

Message de Log

javadoc

Change Summary

Modification

--- a/build.xml
+++ b/build.xml
@@ -1,6 +1,6 @@
11 <?xml version="1.0" encoding="utf-8" ?>
22 <!DOCTYPE configuration>
3-<project name="cutter" default="all" basedir=".">
3+<project name="osmCutter" default="all" basedir=".">
44 <!--
55 ソース以外にビルドに必要なライブラリ
66 ../hayashi_0225.jar
@@ -32,7 +32,7 @@
3232 <!--
3333 [STEP 2] コンパイル
3434 -->
35- <target name="compile_src" depends="clean" description="コンパイル src">
35+ <target name="compile_src" description="コンパイル src">
3636 <javac optimize="off" debug="on" verbose="false" srcdir="${src}" destdir="${classes}" encoding="UTF-8" >
3737 <include name="**" />
3838 <exclude name="**/*.smap" />
@@ -46,6 +46,7 @@
4646 </classpath>
4747 </javac>
4848 </target>
49+
4950 <target name="compile_test" depends="compile_src" description="コンパイル test">
5051 <javac optimize="off" debug="on" verbose="false" srcdir="${test}" destdir="${classes}" encoding="UTF-8" >
5152 <include name="**" />
@@ -62,11 +63,33 @@
6263 </javac>
6364 </target>
6465
66+ <!--
67+ Java Doc
68+ -->
69+ <target name="javadoc" depends="compile_src" >
70+ <javadoc sourcepath="src"
71+ encoding="UTF-8"
72+ packagenames="*"
73+ Windowtitle="${appname}"
74+ doctitle="${appname}"
75+ docencoding="UTF-8"
76+ bottom=""
77+ Author="true"
78+ destdir="api">
79+ <classpath>
80+ <pathelement path="${src}"/>
81+ <fileset dir="${javalib}">
82+ <include name="${hayashilib}"/>
83+ <include name="${dblib}"/>
84+ </fileset>
85+ </classpath>
86+ </javadoc>
87+ </target>
6588
6689 <!--
6790 [STEP 3] リンク
6891 -->
69- <target name="create_run_jar" depends="compile_src" description="'${appname}.jar'を作成する">
92+ <target name="create_run_jar" depends="javadoc" description="'${appname}.jar'を作成する">
7093 <tstamp>
7194 <format property="ts" pattern="yyyy/MM/dd-HH:mm:ss-z"/>
7295 </tstamp>
@@ -84,6 +107,7 @@
84107 <zipfileset dir="${classes}"/>
85108 <zipfileset dir="${src}"/>
86109 <zipfileset dir="${test}"/>
110+ <zipfileset dir="api"/>
87111 <zipfileset dir="${javalib}" includes="${hayashilib}"/>
88112 <zipfileset dir="${javalib}" includes="${dblib}"/>
89113 </jar>
--- a/src/osm/jp/DbBigrelation.java
+++ b/src/osm/jp/DbBigrelation.java
@@ -348,12 +348,10 @@ public class DbBigrelation
348348
349349 /**
350350 *
351- * idref BIGINT NOT NULL
352- * k VARCHAR(128)
353- * v VARCHAR(1024)
351+ * INSERT INTO tag (idref,k,v) VALUES (id,keyStr,valueStr)
354352 *
355353 * @param con
356- * @param idStr
354+ * @param id
357355 * @param keyStr
358356 * @param valueStr
359357 * @throws SQLException
@@ -374,9 +372,7 @@ public class DbBigrelation
374372
375373 /**
376374 *
377- * idref BIGINT NOT NULL
378- * ref BIGINT
379- * cnt DOUBLE
375+ * INSERT INTO NDREF (idref,ref,cnt) VALUES (?,?,?)
380376 *
381377 * @param con
382378 * @param id WAY id
@@ -430,8 +426,10 @@ public class DbBigrelation
430426
431427 /**
432428 * WAYを接続する
433- * @param addway
434- * @throws SQLException
429+ * @param con
430+ * @param firstwayid
431+ * @param secondwayid
432+ * @throws SQLException
435433 */
436434 public static void connect_WAY(Connection con, long firstwayid, long secondwayid) throws SQLException {
437435 PreparedStatement ps1 = con.prepareStatement("select max(CNT) from NDREF where (idref = ?)");
@@ -490,10 +488,10 @@ public class DbBigrelation
490488 }
491489
492490 /**
493- * WAYをOSMデータから削除する
491+ * NODEをOSMデータから削除する
494492 * 別途、WAYやRELATIONのメンバーから削除する必要があります。
495493 * @param con
496- * @param way
494+ * @param node
497495 * @throws SQLException
498496 */
499497 public static void delete_NODE(Connection con, OsmNode node) throws SQLException
@@ -829,7 +827,8 @@ public class DbBigrelation
829827 /**
830828 * リレーションメンバーのロールを得る
831829 * @param con
832- * @param idref 調査対象のmember-id
830+ * @param relationid
831+ * @param wayid 調査対象のmember-id
833832 * @return role ("outer" or "inner")
834833 * @throws SQLException
835834 */
@@ -895,7 +894,7 @@ public class DbBigrelation
895894 *
896895 * @param con
897896 * @param firstnode
898- * @return
897+ * @return WayID
899898 * @throws SQLException
900899 */
901900 public static long getWayidOfFirstnode(Connection con, OsmNode firstnode) throws SQLException {
@@ -929,7 +928,7 @@ public class DbBigrelation
929928 * @param con
930929 * @param result
931930 * @param idref
932- * @return
931+ * @return NDの数
933932 * @throws SQLException
934933 */
935934 public static int getNDs(Connection con, ArrayList<NDref> result, long idref) throws SQLException {
@@ -990,7 +989,7 @@ public class DbBigrelation
990989 *
991990 * @param con
992991 * @param ow
993- * @return
992+ * @return NODEの数
994993 * @throws IOException
995994 * @throws SQLException
996995 */
@@ -1051,7 +1050,7 @@ public class DbBigrelation
10511050 *
10521051 * @param con
10531052 * @param ow
1054- * @return
1053+ * @return WAYの数
10551054 * @throws IOException
10561055 * @throws SQLException
10571056 */
@@ -1113,7 +1112,7 @@ public class DbBigrelation
11131112 *
11141113 * @param con
11151114 * @param ow
1116- * @return
1115+ * @return NODEの数
11171116 * @throws IOException
11181117 * @throws SQLException
11191118 */
@@ -1186,7 +1185,7 @@ public class DbBigrelation
11861185 /**
11871186 * Table.NODE からNODE.IDが最小のID値を取り出す。
11881187 * @param con
1189- * @return
1188+ * @return NODE.ID
11901189 * @throws SQLException
11911190 */
11921191 public static long getOsmnode_MinId(Connection con) throws SQLException {
@@ -1203,7 +1202,7 @@ public class DbBigrelation
12031202 /**
12041203 * Table.NODE からNODE.IDが最小のID値を取り出す。
12051204 * @param con
1206- * @return
1205+ * @return WAY.IDREF
12071206 * @throws SQLException
12081207 */
12091208 public static long getWAY_MinId(Connection con) throws SQLException {
@@ -1221,7 +1220,7 @@ public class DbBigrelation
12211220 /**
12221221 * Table.MEMBER からMEMBER.IDが最小のID値を取り出す。
12231222 * @param con
1224- * @return
1223+ * @return MEMBER.IDREF
12251224 * @throws SQLException
12261225 */
12271226 public static long getMEMBER_MinId(Connection con) throws SQLException {
@@ -1238,7 +1237,7 @@ public class DbBigrelation
12381237 /**
12391238 * Table.MEMBER からMEMBER.IDが最小のID値を取り出す。
12401239 * @param con
1241- * @return
1240+ * @return 最大値
12421241 * @throws SQLException
12431242 */
12441243 public static double getMEMBER_maxCNT(Connection con, long relationid) throws SQLException {
--- a/src/osm/jp/Member.java
+++ b/src/osm/jp/Member.java
@@ -34,7 +34,7 @@ public class Member {
3434 /**
3535 * <member type='way' ref='-223310' role='outer' />
3636 * <member type='way' ref='90563930' role='inner' />
37- * @return
37+ * @return このインスタンスを表現した文字列
3838 */
3939 public String show() {
4040 return ("id='"+ idref +"' type='"+ typeStr +"' ref='"+ ref +"' role='"+ roleStr +"'");
--- a/src/osm/jp/OsmNode.java
+++ b/src/osm/jp/OsmNode.java
@@ -71,7 +71,7 @@ public class OsmNode {
7171 /**
7272 * Object compare [LAT & LON]
7373 * @param osmnode
74- * @return
74+ * @return 等しければtrue
7575 */
7676 public boolean equals(OsmNode osmnode) {
7777 //if (this.idref != osmnode.idref) return false;
--- a/src/osm/jp/Relation.java
+++ b/src/osm/jp/Relation.java
@@ -32,7 +32,7 @@ public class Relation {
3232 /**
3333 * <relation id='-223340' action='modify' visible='true'>
3434 * <relation id='1331167' timestamp='2012-12-17T09:52:06Z' uid='621319' user='hayashi' visible='true' version='11' changeset='14303816'>
35- * @return
35+ * @return このインスタンスを表現した文字列
3636 */
3737 public String show() {
3838 if (this.id == 0L) {
--- a/src/osm/jp/RelationCutter.java
+++ b/src/osm/jp/RelationCutter.java
@@ -17,6 +17,25 @@ import java.sql.SQLException;
1717 import java.util.ArrayList;
1818 import java.util.Iterator;
1919
20+/**
21+ * 巨大リレーション(森林)を分割する。<br>
22+ *
23+ * <h3>pending</h3>
24+ * <ul>
25+ * <li>森林に特化</li>
26+ * <li>リレーション化された森林に特化</li>
27+ * <li>一度に扱えるリレーションは1つ</li>
28+ * <li>リレーションとはマルチポリゴン。ROLE=OUTER/INNER にのみ対応</li>
29+ * <li>二重にポリゴン化されているのは正しく分割されない。別のリレーションに分けること</li>
30+ * </ul>
31+ *
32+ * @author hayashi
33+ *
34+ */
35+/**
36+ * @author hayashi
37+ *
38+ */
2039 public class RelationCutter {
2140
2241 String filter = "";
@@ -36,7 +55,8 @@ public class RelationCutter {
3655 * @throws FileNotFoundException
3756 * @throws TransformerException
3857 * @throws SAXException
39- * @throws ParserConfigurationException */
58+ * @throws ParserConfigurationException
59+ */
4060 public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, SQLException, IOException, ParserConfigurationException, SAXException, TransformerException
4161 {
4262 /**
@@ -57,277 +77,37 @@ public class RelationCutter {
5777 DbBigrelation.initDb(con); // 'tableを新規に作る
5878
5979 try {
60- Logger.logger.info("(step1) ["+ args[0] +"]をインポートします。");
80+ /*
81+ * OSMデータをローカルデータベースにインポートします
82+ */
83+ Logger.logger.info("(step1) ["+ args[0] +"]をローカルデータベースにインポートします。");
6184 File iFile = new File(args[0]);
6285 inputFile(con, iFile);
6386
6487 String iStr = iFile.getName();
6588 DbBigrelation.export(con);
66- Logger.logger.info("["+ iStr +"]つのファイルをインポートしました。");
67-
68- Logger.logger.info("(step2) WAYにboundaryノードを挿入する");
6989 ArrayList<Relation> relations = new ArrayList<Relation>();
7090 DbBigrelation.getRelations(con, relations);
71- Iterator<Relation> irelation = relations.iterator();
72- while (irelation.hasNext()) {
73- Relation relation = irelation.next();
74- System.out.println("RELATION: "+ relation.show());
75-
76- ArrayList<Tag> tags = new ArrayList<Tag>();
77- DbBigrelation.getTags(con, tags, relation.id);
78- Iterator<Tag> ii = tags.iterator();
79- while (ii.hasNext()) {
80- Tag tag = ii.next();
81- System.out.println("\tTAG: "+ tag.show());
82- }
83-
84- ArrayList<Member> members = new ArrayList<Member>();
85- DbBigrelation.getMembers(con, members, relation.id);
86- Iterator<Member> imember = members.iterator();
87- while (imember.hasNext()) {
88- Member member = imember.next();
89-
90- // MEMBER->WAY
91- Way way = new Way();
92- if (DbBigrelation.getWay(con, way, member.ref)) {
93- if (way.action != OsmNode.ACTION_DELETE) {
94- System.out.println("\tMEMBER=WAY: id="+ way.idref);
95-
96- OsmNode before = null;
97- ArrayList<OsmNode> osmnodes = new ArrayList<OsmNode>();
98- DbBigrelation.getOsmnodes(con, osmnodes, way.idref);
99- Iterator<OsmNode> iwaynode = osmnodes.iterator();
100- while (iwaynode.hasNext()) {
101- OsmNode osmnode = iwaynode.next();
102- osmnode.loadTag(con);
103- if (osmnode.tags.size() > 0) {
104- // TAG付きのWAYNODEはWAYから分離させる
105- OsmNode newnode = new OsmNode(osmnode);
106- newnode.idref = 0L;
107- newnode.action = OsmNode.ACTION_MODIFY;
108- DbBigrelation.insert_NODE(con, newnode);
109- DbBigrelation.swap_NDREF(con, way.idref, osmnode.idref, newnode.idref);
110- way.action = OsmNode.ACTION_MODIFY;
111- }
112- System.out.println("\tMEMBER=WAY=ND: id="+ osmnode.idref +" ["+ osmnode.lat +" : "+ osmnode.lon +"]");
113-
114- if (before == null) {
115- before = new OsmNode(osmnode);
116- continue;
117- }
118- OsmNode newnode = null;
119- do {
120- newnode = bundary(con, before, osmnode);
121- if (newnode == null) {
122- before = new OsmNode(osmnode);
123- }
124- else {
125- // WAYにboundaryノードを挿入する
126- newnode.setCounter((before.getCounter() + osmnode.getCounter()) / 2.0D);
127- DbBigrelation.insert_NDREF(con, way.idref, newnode.idref, newnode.getCounter());
128- //DbBigrelation.insert_NODE(con, newnode);
129- before = new OsmNode(newnode);
130- }
131- }
132- while (newnode != null);
133- }
134- }
135- }
136- }
137- }
91+ Logger.logger.info("["+ iStr +"]つのファイルをインポートしました。");
92+
93+ /*
94+ * WAYに分割点ノードを挿入する
95+ */
96+ Logger.logger.info("(step2) WAYに分割点ノードを挿入する");
97+ devideBundaryNode(con, relations);
13898
13999 /*
140100 * RELATION-MEMBER-WAYのウェイを分割点で分割します。
141101 */
142102 Logger.logger.info("(step3) RELATION-MEMBER-WAYのウェイを分割点で分割します。");
143- Iterator<Relation> irelations = relations.iterator();
144- while (irelations.hasNext()) {
145- Relation relation = irelations.next();
146- if (relation.action == OsmNode.ACTION_DELETE) {
147- continue;
148- }
149- relation.loadMember(con);
150- System.out.println("RELATION: "+ relation.show());
151-
152- Iterator<Member> iii = relation.members.iterator();
153- while (iii.hasNext()) {
154- Member member = iii.next();
155-
156- // MEMBER->WAY
157- Way way = new Way();
158- if (DbBigrelation.getWay(con, way, member.ref)) {
159- if (way.action != OsmNode.ACTION_DELETE) {
160- DbBigrelation.getTags(con, way.tags, way.idref);
161- DbBigrelation.getOsmnodes(con, way.waynodes, way.idref);
162-
163- Way newway = new Way(way);
164- newway.idref = 0L;
165- newway.waynodes = new ArrayList<OsmNode>();
166-
167- // 分割点を調べて、分割点でWAYを分割する。
168- // WAYNODEの最初と最後は調べない
169- for (int i = 0; i < way.waynodes.size(); i++) {
170- OsmNode osmnode = way.waynodes.get(i);
171- if (i == 0) {
172- // 最初のノード
173- newway.waynodes.add(osmnode);
174- }
175- else if ((i+1) == way.waynodes.size()) {
176- // 最終のノード
177- newway.waynodes.add(osmnode);
178-
179- // 分割WAYをDATABASEに保存する
180- if (newway.idref <= 0) {
181- insertWAY2db(con, newway);
182- System.out.println("\tNew WAY: "+ newway.show());
183-
184- // NEWWAYをMEMBERに追加する
185- Member newmember = new Member(member);
186- newmember.idref = DbBigrelation.getMEMBER_MinId(con) - 1L;
187- newmember.ref = newway.idref;
188- newmember.relationid = relation.id;
189- insertMEMBER2db(con, newmember);
190- }
191-
192- // 元のWAYをDBから削除する
193- DbBigrelation.delete_WAY(con, way);
194- DbBigrelation.delete_MEMBER(con, relation.id, way.idref);
195- way.waynodes = new ArrayList<OsmNode>();
196- }
197- else {
198- if (isLatBoundary(osmnode.lat)) {
199- // WAYをboundaryノードで分割する
200- OsmNode newnode = new OsmNode(osmnode);
201- newnode.idref = 0L;
202- DbBigrelation.insert_NODE(con, newnode);
203- newway.waynodes.add(newnode);
204-
205- // NEWWAYをDBに追加する
206- insertWAY2db(con, newway);
207- System.out.println("\tNew WAY: "+ newway.show());
208-
209- // NEWWAYをMEMBERに追加する
210- Member newmember = new Member(member);
211- newmember.idref = 0L;
212- newmember.ref = newway.idref;
213- newmember.relationid = relation.id;
214- insertMEMBER2db(con, newmember);
215-
216- // この分割ノードから開始される新しいWAYを生成する
217- newway = new Way(way);
218- newway.idref = 0L;
219- newway.waynodes = new ArrayList<OsmNode>();
220- newway.waynodes.add(osmnode);
221- }
222- else {
223- newway.waynodes.add(osmnode);
224- }
225- }
226- }
227- }
228- }
229- }
230- }
103+ devideBundaryWay(con, relations);
231104
232105 /*
233106 * 分割点で分割したウェイをつなぐ
234107 */
235108 Logger.logger.info("(step4) 分割点で分割したウェイをつなぐ");
236- irelations = relations.iterator();
237- while (irelations.hasNext()) {
238- Relation relation = irelations.next();
239- if (relation.action == OsmNode.ACTION_DELETE) {
240- continue;
241- }
242-
243- relation.loadMember(con);
244- System.out.println("RELATION: "+ relation.show());
245-
246- for (int imember = 0; imember < relation.members.size(); imember++) {
247- Member member = relation.members.get(imember);
248-
249- // MEMBER->WAY
250- Way way = new Way();
251- if (!DbBigrelation.getWay(con, way, member.ref)) {
252- Logger.logger.warning("MEMBERに指定されているWAYが存在しません。(way:id="+ member.ref +")");
253- continue;
254- }
255-
256- if (way.action != OsmNode.ACTION_DELETE) {
257- Logger.logger.info("WAYを調べます。(way:id="+ way.idref +" [])");
258- way.loadTag(con);
259- if (way.loadNodes(con) < 1) {
260- Logger.logger.warning("ノードを持たないWAYです。(way:id="+ way.idref +")");
261- DbBigrelation.delete_MEMBER(con, relation.id, way.idref);
262- DbBigrelation.delete_WAY(con, way);
263- continue;
264- }
265- else {
266- String role = DbBigrelation.getRelationWayRole(con, relation.id, way.idref);
267- if ((role != null) && role.equals("outer")) {
268- // 最後のWAYNODEが分割点かどうかを調べて、分割点どうしを連結する。
269- OsmNode lastnode = way.waynodes.get(way.waynodes.size() - 1); // 最終のノード
270-
271- if (isLatBoundary(lastnode.lat)) {
272- OsmNode maenode = way.waynodes.get(way.waynodes.size() - 2); // 一つ前のノード
273- BigDecimal delta = (lastnode.lat).subtract(maenode.lat);
274- int compare = delta.compareTo(new BigDecimal("0.0000000"));
275- switch(compare) {
276- case 1: // (delta > 0.0000000)
277- // 南から
278- if (arrow) {
279- // 南から 右回りなら、東へ
280- processEast(con, way, relation.id);
281- }
282- else {
283- // 南から 左回りなら、西へ
284- processWest(con, way, relation.id);
285- }
286- break;
287- case -1: // (delta < 0.0000000)
288- // 北から
289- if (arrow) {
290- // 北から?右回りなら、西へ
291- processWest(con, way, relation.id);
292- }
293- else {
294- // 北から?左まわりなら、東へ
295- processEast(con, way, relation.id);
296- }
297- break;
298- default: // (delta == 0.0000000)
299- // 真東から? 単純結合
300- // 真西から? 単純結合
301-
302- /* [[PENDING]] */
303- /*
304- * とりあえず、あとまわし
305- */
306- }
307- }
308- }
309- else {
310- // 最終ノードが分割点でない場合には、次のWAYと接続する。
311- /*
312- int nextindex = ((imember + 1) >= relation.members.size() ? 0 : imember + 1);
313- Member nextmember = relation.members.get(nextindex);
314- Way addway = new Way();
315- DbBigrelation.getWay(con, addway, nextmember.ref);
316- addway.loadTag(con);
317- if (addway.loadNodes(con) < 1) {
318- Logger.logger.warning("ノードを持たないWAYに接続しようとしました。(way:id="+ addway.idref +")");
319- }
320- else {
321- way.add(con, addway);
322- way.action = OsmNode.ACTION_MODIFY;
323- }
324- */
325- }
326- }
327- }
328- }
329- }
330-
109+ reconnectWay(con, relations);
110+
331111 /*
332112 * 分割されたWAYを接続してエリアを構成します。
333113 */
@@ -357,6 +137,15 @@ public class RelationCutter {
357137 processLat(con, way, -1, relationid);
358138 }
359139
140+ /**
141+ * 東西方向の分割点同士を接続する
142+ *
143+ * @param con
144+ * @param way
145+ * @param order
146+ * @param relationid
147+ * @throws SQLException
148+ */
360149 public static void processLat(Connection con, Way way, int order, long relationid) throws SQLException {
361150 OsmNode lastnode = way.waynodes.get(way.waynodes.size() - 1); // 最終のノード
362151 String sql;
@@ -430,13 +219,14 @@ public class RelationCutter {
430219 }
431220
432221 /**
433- * nextwayのroleがinnerのときには、roleをouterに変更する
434- * innerはnextwayだけとは限らない、nextwayに接続されたすべてのwayをouterに変更する必要あり
435- * innerへ接続する場合には、往復でwayを接続する。
222+ * nextwayのroleがinnerのときには、roleをouterに変更する<br>
223+ * innerはnextwayだけとは限らない、nextwayに接続されたすべてのwayをouterに変更する必要あり<br>
224+ * innerへ接続する場合には、往復でwayを接続する。<br>
436225 * @param con
437- * @param before
438- * @param osmnode
439- * @return
226+ * @param startNode
227+ * @param firstway
228+ * @param relationid
229+ * @return 最後のWAY
440230 * @throws IOException
441231 * @throws SQLException
442232 */
@@ -479,7 +269,7 @@ public class RelationCutter {
479269 * ただし、Wayの最初のNODEは対象外とする
480270 * @param way
481271 * @param node
482- * @return
272+ * @return ノードが含まれていればtrue
483273 */
484274 static boolean includeNodeWithoutStart(Way way, OsmNode node) {
485275 for (int i=1; i < way.waynodes.size(); i++) {
@@ -642,11 +432,291 @@ public class RelationCutter {
642432 iCounter += importNodes(con, root, iStr.substring(0, iStr.length() - 4), timeStampStr, 0L);
643433 Logger.logger.info("relation counter = ["+ iCounter +"]");
644434 }
435+
436+ /**
437+ * WAYにboundaryノードを挿入する
438+ *
439+ * @param con ローカルデータベースコネクション
440+ * @param relations リレーションインスタンスを格納したArrayList
441+ * @throws SQLException
442+ * @throws IOException
443+ */
444+ static void devideBundaryNode(Connection con, ArrayList<Relation> relations) throws SQLException, IOException {
445+ Iterator<Relation> irelation = relations.iterator();
446+ while (irelation.hasNext()) {
447+ Relation relation = irelation.next();
448+ System.out.println("RELATION: "+ relation.show());
449+
450+ ArrayList<Tag> tags = new ArrayList<Tag>();
451+ DbBigrelation.getTags(con, tags, relation.id);
452+ Iterator<Tag> ii = tags.iterator();
453+ while (ii.hasNext()) {
454+ Tag tag = ii.next();
455+ System.out.println("\tTAG: "+ tag.show());
456+ }
457+
458+ ArrayList<Member> members = new ArrayList<Member>();
459+ DbBigrelation.getMembers(con, members, relation.id);
460+ Iterator<Member> imember = members.iterator();
461+ while (imember.hasNext()) {
462+ Member member = imember.next();
463+
464+ // MEMBER->WAY
465+ Way way = new Way();
466+ if (DbBigrelation.getWay(con, way, member.ref)) {
467+ if (way.action != OsmNode.ACTION_DELETE) {
468+ System.out.println("\tMEMBER=WAY: id="+ way.idref);
469+
470+ OsmNode before = null;
471+ ArrayList<OsmNode> osmnodes = new ArrayList<OsmNode>();
472+ DbBigrelation.getOsmnodes(con, osmnodes, way.idref);
473+ Iterator<OsmNode> iwaynode = osmnodes.iterator();
474+ while (iwaynode.hasNext()) {
475+ OsmNode osmnode = iwaynode.next();
476+ osmnode.loadTag(con);
477+ if (osmnode.tags.size() > 0) {
478+ // TAG付きのWAYNODEはWAYから分離させる
479+ OsmNode newnode = new OsmNode(osmnode);
480+ newnode.idref = 0L;
481+ newnode.action = OsmNode.ACTION_MODIFY;
482+ DbBigrelation.insert_NODE(con, newnode);
483+ DbBigrelation.swap_NDREF(con, way.idref, osmnode.idref, newnode.idref);
484+ way.action = OsmNode.ACTION_MODIFY;
485+ }
486+ System.out.println("\tMEMBER=WAY=ND: id="+ osmnode.idref +" ["+ osmnode.lat +" : "+ osmnode.lon +"]");
487+
488+ if (before == null) {
489+ before = new OsmNode(osmnode);
490+ continue;
491+ }
492+ OsmNode newnode = null;
493+ do {
494+ newnode = bundary(con, before, osmnode);
495+ if (newnode == null) {
496+ before = new OsmNode(osmnode);
497+ }
498+ else {
499+ // WAYにboundaryノードを挿入する
500+ newnode.setCounter((before.getCounter() + osmnode.getCounter()) / 2.0D);
501+ DbBigrelation.insert_NDREF(con, way.idref, newnode.idref, newnode.getCounter());
502+ //DbBigrelation.insert_NODE(con, newnode);
503+ before = new OsmNode(newnode);
504+ }
505+ }
506+ while (newnode != null);
507+ }
508+ }
509+ }
510+ }
511+ }
512+ }
513+
514+ /**
515+ * 分割点ノードが挿入されたリレーションメンバーのWAYを分割点でWAY分割します
516+ *
517+ * @param con
518+ * @param relations
519+ * @throws SQLException
520+ * @throws IOException
521+ */
522+ static void devideBundaryWay(Connection con, ArrayList<Relation> relations) throws SQLException, IOException {
523+ Iterator<Relation> irelations = relations.iterator();
524+ while (irelations.hasNext()) {
525+ Relation relation = irelations.next();
526+ if (relation.action == OsmNode.ACTION_DELETE) {
527+ continue;
528+ }
529+ relation.loadMember(con);
530+ System.out.println("RELATION: "+ relation.show());
531+
532+ Iterator<Member> iii = relation.members.iterator();
533+ while (iii.hasNext()) {
534+ Member member = iii.next();
535+
536+ // MEMBER->WAY
537+ Way way = new Way();
538+ if (DbBigrelation.getWay(con, way, member.ref)) {
539+ if (way.action != OsmNode.ACTION_DELETE) {
540+ DbBigrelation.getTags(con, way.tags, way.idref);
541+ DbBigrelation.getOsmnodes(con, way.waynodes, way.idref);
542+
543+ Way newway = new Way(way);
544+ newway.idref = 0L;
545+ newway.waynodes = new ArrayList<OsmNode>();
546+
547+ // 分割点を調べて、分割点でWAYを分割する。
548+ // WAYNODEの最初と最後は調べない
549+ for (int i = 0; i < way.waynodes.size(); i++) {
550+ OsmNode osmnode = way.waynodes.get(i);
551+ if (i == 0) {
552+ // 最初のノード
553+ newway.waynodes.add(osmnode);
554+ }
555+ else if ((i+1) == way.waynodes.size()) {
556+ // 最終のノード
557+ newway.waynodes.add(osmnode);
558+
559+ // 分割WAYをDATABASEに保存する
560+ if (newway.idref <= 0) {
561+ insertWAY2db(con, newway);
562+ System.out.println("\tNew WAY: "+ newway.show());
563+
564+ // NEWWAYをMEMBERに追加する
565+ Member newmember = new Member(member);
566+ newmember.idref = DbBigrelation.getMEMBER_MinId(con) - 1L;
567+ newmember.ref = newway.idref;
568+ newmember.relationid = relation.id;
569+ insertMEMBER2db(con, newmember);
570+ }
571+
572+ // 元のWAYをDBから削除する
573+ DbBigrelation.delete_WAY(con, way);
574+ DbBigrelation.delete_MEMBER(con, relation.id, way.idref);
575+ way.waynodes = new ArrayList<OsmNode>();
576+ }
577+ else {
578+ if (isLatBoundary(osmnode.lat)) {
579+ // WAYをboundaryノードで分割する
580+ OsmNode newnode = new OsmNode(osmnode);
581+ newnode.idref = 0L;
582+ DbBigrelation.insert_NODE(con, newnode);
583+ newway.waynodes.add(newnode);
584+
585+ // NEWWAYをDBに追加する
586+ insertWAY2db(con, newway);
587+ System.out.println("\tNew WAY: "+ newway.show());
588+
589+ // NEWWAYをMEMBERに追加する
590+ Member newmember = new Member(member);
591+ newmember.idref = 0L;
592+ newmember.ref = newway.idref;
593+ newmember.relationid = relation.id;
594+ insertMEMBER2db(con, newmember);
595+
596+ // この分割ノードから開始される新しいWAYを生成する
597+ newway = new Way(way);
598+ newway.idref = 0L;
599+ newway.waynodes = new ArrayList<OsmNode>();
600+ newway.waynodes.add(osmnode);
601+ }
602+ else {
603+ newway.waynodes.add(osmnode);
604+ }
605+ }
606+ }
607+ }
608+ }
609+ }
610+ }
611+ }
612+
613+ /**
614+ * 分割点で分割したウェイをつなぐ
615+ * @param con
616+ * @param relations
617+ * @throws SQLException
618+ */
619+ public static void reconnectWay(Connection con, ArrayList<Relation> relations) throws SQLException {
620+ Iterator<Relation> irelations = relations.iterator();
621+ while (irelations.hasNext()) {
622+ Relation relation = irelations.next();
623+ if (relation.action == OsmNode.ACTION_DELETE) {
624+ continue;
625+ }
626+
627+ relation.loadMember(con);
628+ System.out.println("RELATION: "+ relation.show());
629+
630+ for (int imember = 0; imember < relation.members.size(); imember++) {
631+ Member member = relation.members.get(imember);
632+
633+ // MEMBER->WAY
634+ Way way = new Way();
635+ if (!DbBigrelation.getWay(con, way, member.ref)) {
636+ Logger.logger.warning("MEMBERに指定されているWAYが存在しません。(way:id="+ member.ref +")");
637+ continue;
638+ }
639+
640+ if (way.action != OsmNode.ACTION_DELETE) {
641+ Logger.logger.info("WAYを調べます。(way:id="+ way.idref +" [])");
642+ way.loadTag(con);
643+ if (way.loadNodes(con) < 1) {
644+ Logger.logger.warning("ノードを持たないWAYです。(way:id="+ way.idref +")");
645+ DbBigrelation.delete_MEMBER(con, relation.id, way.idref);
646+ DbBigrelation.delete_WAY(con, way);
647+ continue;
648+ }
649+ else {
650+ String role = DbBigrelation.getRelationWayRole(con, relation.id, way.idref);
651+ if ((role != null) && role.equals("outer")) {
652+ // 最後のWAYNODEが分割点かどうかを調べて、分割点どうしを連結する。
653+ OsmNode lastnode = way.waynodes.get(way.waynodes.size() - 1); // 最終のノード
654+
655+ if (isLatBoundary(lastnode.lat)) {
656+ OsmNode maenode = way.waynodes.get(way.waynodes.size() - 2); // 一つ前のノード
657+ BigDecimal delta = (lastnode.lat).subtract(maenode.lat);
658+ int compare = delta.compareTo(new BigDecimal("0.0000000"));
659+ switch(compare) {
660+ case 1: // (delta > 0.0000000)
661+ // 南から
662+ if (arrow) {
663+ // 南から 右回りなら、東へ
664+ processEast(con, way, relation.id);
665+ }
666+ else {
667+ // 南から 左回りなら、西へ
668+ processWest(con, way, relation.id);
669+ }
670+ break;
671+ case -1: // (delta < 0.0000000)
672+ // 北から
673+ if (arrow) {
674+ // 北から?右回りなら、西へ
675+ processWest(con, way, relation.id);
676+ }
677+ else {
678+ // 北から?左まわりなら、東へ
679+ processEast(con, way, relation.id);
680+ }
681+ break;
682+ default: // (delta == 0.0000000)
683+ // 真東から? 単純結合
684+ // 真西から? 単純結合
685+
686+ /* [[PENDING]] */
687+ /*
688+ * とりあえず、あとまわし
689+ */
690+ }
691+ }
692+ }
693+ else {
694+ // 最終ノードが分割点でない場合には、次のWAYと接続する。
695+ /*
696+ int nextindex = ((imember + 1) >= relation.members.size() ? 0 : imember + 1);
697+ Member nextmember = relation.members.get(nextindex);
698+ Way addway = new Way();
699+ DbBigrelation.getWay(con, addway, nextmember.ref);
700+ addway.loadTag(con);
701+ if (addway.loadNodes(con) < 1) {
702+ Logger.logger.warning("ノードを持たないWAYに接続しようとしました。(way:id="+ addway.idref +")");
703+ }
704+ else {
705+ way.add(con, addway);
706+ way.action = OsmNode.ACTION_MODIFY;
707+ }
708+ */
709+ }
710+ }
711+ }
712+ }
713+ }
714+ }
645715
646716 /**
647717 * ローカルデータベース内の情報を出力する
648718 * @param con
649- * @param iCode
719+ * @param outputFileName
650720 * @throws IOException
651721 * @throws SQLException
652722 */
@@ -682,7 +752,7 @@ public class RelationCutter {
682752 * @param node
683753 * @param iFileName // ソースファイル名(拡張子を含まない)
684754 * @param timeStampStr
685- * @return
755+ * @return インポートしたノード数
686756 * @throws IOException
687757 * @throws SQLException
688758 */
@@ -932,9 +1002,11 @@ public class RelationCutter {
9321002
9331003 /**
9341004 *
935- * <nd ref=''/>
1005+ * <pre><nd ref=''/></pre>
9361006 * @param con
9371007 * @param node
1008+ * @param id
1009+ * @param ndCounter
9381010 * @throws IOException
9391011 * @throws SQLException
9401012 */
@@ -954,10 +1026,11 @@ public class RelationCutter {
9541026 }
9551027
9561028 /**
957- * create new OSMNODE in database
1029+ * OSMNODEインスタンスをローカルデータベースに追加する
1030+ *
9581031 * @param con
9591032 * @param node
960- * @return
1033+ * @return 追加したNODEのIDREF
9611034 * @throws IOException
9621035 * @throws SQLException
9631036 */
@@ -978,10 +1051,11 @@ public class RelationCutter {
9781051 }
9791052
9801053 /**
981- * create new WAY in database
1054+ * WAYインスタンスをデータベースに追加する
1055+ *
9821056 * @param con
9831057 * @param way
984- * @return
1058+ * @return 追加したWAYのID
9851059 * @throws IOException
9861060 * @throws SQLException
9871061 */
@@ -1007,10 +1081,10 @@ public class RelationCutter {
10071081 }
10081082
10091083 /**
1010- * create new WAY in database
1084+ * MEMBERインスタンスをローカルデータベースに追加します
10111085 * @param con
1012- * @param way
1013- * @return
1086+ * @param member
1087+ * @return 追加したMEMBERのIDREF
10141088 * @throws IOException
10151089 * @throws SQLException
10161090 */