巨大森林を分割する
Révision | 59ed10ba0317163c54d08d1ae244306749a16d55 (tree) |
---|---|
l'heure | 2013-12-21 15:14:49 |
Auteur | hayashi <hayashi.yuu@gmai...> |
Commiter | hayashi |
javadoc
@@ -1,6 +1,6 @@ | ||
1 | 1 | <?xml version="1.0" encoding="utf-8" ?> |
2 | 2 | <!DOCTYPE configuration> |
3 | -<project name="cutter" default="all" basedir="."> | |
3 | +<project name="osmCutter" default="all" basedir="."> | |
4 | 4 | <!-- |
5 | 5 | ソース以外にビルドに必要なライブラリ |
6 | 6 | ../hayashi_0225.jar |
@@ -32,7 +32,7 @@ | ||
32 | 32 | <!-- |
33 | 33 | [STEP 2] コンパイル |
34 | 34 | --> |
35 | - <target name="compile_src" depends="clean" description="コンパイル src"> | |
35 | + <target name="compile_src" description="コンパイル src"> | |
36 | 36 | <javac optimize="off" debug="on" verbose="false" srcdir="${src}" destdir="${classes}" encoding="UTF-8" > |
37 | 37 | <include name="**" /> |
38 | 38 | <exclude name="**/*.smap" /> |
@@ -46,6 +46,7 @@ | ||
46 | 46 | </classpath> |
47 | 47 | </javac> |
48 | 48 | </target> |
49 | + | |
49 | 50 | <target name="compile_test" depends="compile_src" description="コンパイル test"> |
50 | 51 | <javac optimize="off" debug="on" verbose="false" srcdir="${test}" destdir="${classes}" encoding="UTF-8" > |
51 | 52 | <include name="**" /> |
@@ -62,11 +63,33 @@ | ||
62 | 63 | </javac> |
63 | 64 | </target> |
64 | 65 | |
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> | |
65 | 88 | |
66 | 89 | <!-- |
67 | 90 | [STEP 3] リンク |
68 | 91 | --> |
69 | - <target name="create_run_jar" depends="compile_src" description="'${appname}.jar'を作成する"> | |
92 | + <target name="create_run_jar" depends="javadoc" description="'${appname}.jar'を作成する"> | |
70 | 93 | <tstamp> |
71 | 94 | <format property="ts" pattern="yyyy/MM/dd-HH:mm:ss-z"/> |
72 | 95 | </tstamp> |
@@ -84,6 +107,7 @@ | ||
84 | 107 | <zipfileset dir="${classes}"/> |
85 | 108 | <zipfileset dir="${src}"/> |
86 | 109 | <zipfileset dir="${test}"/> |
110 | + <zipfileset dir="api"/> | |
87 | 111 | <zipfileset dir="${javalib}" includes="${hayashilib}"/> |
88 | 112 | <zipfileset dir="${javalib}" includes="${dblib}"/> |
89 | 113 | </jar> |
@@ -348,12 +348,10 @@ public class DbBigrelation | ||
348 | 348 | |
349 | 349 | /** |
350 | 350 | * |
351 | - * idref BIGINT NOT NULL | |
352 | - * k VARCHAR(128) | |
353 | - * v VARCHAR(1024) | |
351 | + * INSERT INTO tag (idref,k,v) VALUES (id,keyStr,valueStr) | |
354 | 352 | * |
355 | 353 | * @param con |
356 | - * @param idStr | |
354 | + * @param id | |
357 | 355 | * @param keyStr |
358 | 356 | * @param valueStr |
359 | 357 | * @throws SQLException |
@@ -374,9 +372,7 @@ public class DbBigrelation | ||
374 | 372 | |
375 | 373 | /** |
376 | 374 | * |
377 | - * idref BIGINT NOT NULL | |
378 | - * ref BIGINT | |
379 | - * cnt DOUBLE | |
375 | + * INSERT INTO NDREF (idref,ref,cnt) VALUES (?,?,?) | |
380 | 376 | * |
381 | 377 | * @param con |
382 | 378 | * @param id WAY id |
@@ -430,8 +426,10 @@ public class DbBigrelation | ||
430 | 426 | |
431 | 427 | /** |
432 | 428 | * WAYを接続する |
433 | - * @param addway | |
434 | - * @throws SQLException | |
429 | + * @param con | |
430 | + * @param firstwayid | |
431 | + * @param secondwayid | |
432 | + * @throws SQLException | |
435 | 433 | */ |
436 | 434 | public static void connect_WAY(Connection con, long firstwayid, long secondwayid) throws SQLException { |
437 | 435 | PreparedStatement ps1 = con.prepareStatement("select max(CNT) from NDREF where (idref = ?)"); |
@@ -490,10 +488,10 @@ public class DbBigrelation | ||
490 | 488 | } |
491 | 489 | |
492 | 490 | /** |
493 | - * WAYをOSMデータから削除する | |
491 | + * NODEをOSMデータから削除する | |
494 | 492 | * 別途、WAYやRELATIONのメンバーから削除する必要があります。 |
495 | 493 | * @param con |
496 | - * @param way | |
494 | + * @param node | |
497 | 495 | * @throws SQLException |
498 | 496 | */ |
499 | 497 | public static void delete_NODE(Connection con, OsmNode node) throws SQLException |
@@ -829,7 +827,8 @@ public class DbBigrelation | ||
829 | 827 | /** |
830 | 828 | * リレーションメンバーのロールを得る |
831 | 829 | * @param con |
832 | - * @param idref 調査対象のmember-id | |
830 | + * @param relationid | |
831 | + * @param wayid 調査対象のmember-id | |
833 | 832 | * @return role ("outer" or "inner") |
834 | 833 | * @throws SQLException |
835 | 834 | */ |
@@ -895,7 +894,7 @@ public class DbBigrelation | ||
895 | 894 | * |
896 | 895 | * @param con |
897 | 896 | * @param firstnode |
898 | - * @return | |
897 | + * @return WayID | |
899 | 898 | * @throws SQLException |
900 | 899 | */ |
901 | 900 | public static long getWayidOfFirstnode(Connection con, OsmNode firstnode) throws SQLException { |
@@ -929,7 +928,7 @@ public class DbBigrelation | ||
929 | 928 | * @param con |
930 | 929 | * @param result |
931 | 930 | * @param idref |
932 | - * @return | |
931 | + * @return NDの数 | |
933 | 932 | * @throws SQLException |
934 | 933 | */ |
935 | 934 | public static int getNDs(Connection con, ArrayList<NDref> result, long idref) throws SQLException { |
@@ -990,7 +989,7 @@ public class DbBigrelation | ||
990 | 989 | * |
991 | 990 | * @param con |
992 | 991 | * @param ow |
993 | - * @return | |
992 | + * @return NODEの数 | |
994 | 993 | * @throws IOException |
995 | 994 | * @throws SQLException |
996 | 995 | */ |
@@ -1051,7 +1050,7 @@ public class DbBigrelation | ||
1051 | 1050 | * |
1052 | 1051 | * @param con |
1053 | 1052 | * @param ow |
1054 | - * @return | |
1053 | + * @return WAYの数 | |
1055 | 1054 | * @throws IOException |
1056 | 1055 | * @throws SQLException |
1057 | 1056 | */ |
@@ -1113,7 +1112,7 @@ public class DbBigrelation | ||
1113 | 1112 | * |
1114 | 1113 | * @param con |
1115 | 1114 | * @param ow |
1116 | - * @return | |
1115 | + * @return NODEの数 | |
1117 | 1116 | * @throws IOException |
1118 | 1117 | * @throws SQLException |
1119 | 1118 | */ |
@@ -1186,7 +1185,7 @@ public class DbBigrelation | ||
1186 | 1185 | /** |
1187 | 1186 | * Table.NODE からNODE.IDが最小のID値を取り出す。 |
1188 | 1187 | * @param con |
1189 | - * @return | |
1188 | + * @return NODE.ID | |
1190 | 1189 | * @throws SQLException |
1191 | 1190 | */ |
1192 | 1191 | public static long getOsmnode_MinId(Connection con) throws SQLException { |
@@ -1203,7 +1202,7 @@ public class DbBigrelation | ||
1203 | 1202 | /** |
1204 | 1203 | * Table.NODE からNODE.IDが最小のID値を取り出す。 |
1205 | 1204 | * @param con |
1206 | - * @return | |
1205 | + * @return WAY.IDREF | |
1207 | 1206 | * @throws SQLException |
1208 | 1207 | */ |
1209 | 1208 | public static long getWAY_MinId(Connection con) throws SQLException { |
@@ -1221,7 +1220,7 @@ public class DbBigrelation | ||
1221 | 1220 | /** |
1222 | 1221 | * Table.MEMBER からMEMBER.IDが最小のID値を取り出す。 |
1223 | 1222 | * @param con |
1224 | - * @return | |
1223 | + * @return MEMBER.IDREF | |
1225 | 1224 | * @throws SQLException |
1226 | 1225 | */ |
1227 | 1226 | public static long getMEMBER_MinId(Connection con) throws SQLException { |
@@ -1238,7 +1237,7 @@ public class DbBigrelation | ||
1238 | 1237 | /** |
1239 | 1238 | * Table.MEMBER からMEMBER.IDが最小のID値を取り出す。 |
1240 | 1239 | * @param con |
1241 | - * @return | |
1240 | + * @return 最大値 | |
1242 | 1241 | * @throws SQLException |
1243 | 1242 | */ |
1244 | 1243 | public static double getMEMBER_maxCNT(Connection con, long relationid) throws SQLException { |
@@ -34,7 +34,7 @@ public class Member { | ||
34 | 34 | /** |
35 | 35 | * <member type='way' ref='-223310' role='outer' /> |
36 | 36 | * <member type='way' ref='90563930' role='inner' /> |
37 | - * @return | |
37 | + * @return このインスタンスを表現した文字列 | |
38 | 38 | */ |
39 | 39 | public String show() { |
40 | 40 | return ("id='"+ idref +"' type='"+ typeStr +"' ref='"+ ref +"' role='"+ roleStr +"'"); |
@@ -71,7 +71,7 @@ public class OsmNode { | ||
71 | 71 | /** |
72 | 72 | * Object compare [LAT & LON] |
73 | 73 | * @param osmnode |
74 | - * @return | |
74 | + * @return 等しければtrue | |
75 | 75 | */ |
76 | 76 | public boolean equals(OsmNode osmnode) { |
77 | 77 | //if (this.idref != osmnode.idref) return false; |
@@ -32,7 +32,7 @@ public class Relation { | ||
32 | 32 | /** |
33 | 33 | * <relation id='-223340' action='modify' visible='true'> |
34 | 34 | * <relation id='1331167' timestamp='2012-12-17T09:52:06Z' uid='621319' user='hayashi' visible='true' version='11' changeset='14303816'> |
35 | - * @return | |
35 | + * @return このインスタンスを表現した文字列 | |
36 | 36 | */ |
37 | 37 | public String show() { |
38 | 38 | if (this.id == 0L) { |
@@ -17,6 +17,25 @@ import java.sql.SQLException; | ||
17 | 17 | import java.util.ArrayList; |
18 | 18 | import java.util.Iterator; |
19 | 19 | |
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 | + */ | |
20 | 39 | public class RelationCutter { |
21 | 40 | |
22 | 41 | String filter = ""; |
@@ -36,7 +55,8 @@ public class RelationCutter { | ||
36 | 55 | * @throws FileNotFoundException |
37 | 56 | * @throws TransformerException |
38 | 57 | * @throws SAXException |
39 | - * @throws ParserConfigurationException */ | |
58 | + * @throws ParserConfigurationException | |
59 | + */ | |
40 | 60 | public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, SQLException, IOException, ParserConfigurationException, SAXException, TransformerException |
41 | 61 | { |
42 | 62 | /** |
@@ -57,277 +77,37 @@ public class RelationCutter { | ||
57 | 77 | DbBigrelation.initDb(con); // 'tableを新規に作る |
58 | 78 | |
59 | 79 | try { |
60 | - Logger.logger.info("(step1) ["+ args[0] +"]をインポートします。"); | |
80 | + /* | |
81 | + * OSMデータをローカルデータベースにインポートします | |
82 | + */ | |
83 | + Logger.logger.info("(step1) ["+ args[0] +"]をローカルデータベースにインポートします。"); | |
61 | 84 | File iFile = new File(args[0]); |
62 | 85 | inputFile(con, iFile); |
63 | 86 | |
64 | 87 | String iStr = iFile.getName(); |
65 | 88 | DbBigrelation.export(con); |
66 | - Logger.logger.info("["+ iStr +"]つのファイルをインポートしました。"); | |
67 | - | |
68 | - Logger.logger.info("(step2) WAYにboundaryノードを挿入する"); | |
69 | 89 | ArrayList<Relation> relations = new ArrayList<Relation>(); |
70 | 90 | 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); | |
138 | 98 | |
139 | 99 | /* |
140 | 100 | * RELATION-MEMBER-WAYのウェイを分割点で分割します。 |
141 | 101 | */ |
142 | 102 | 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); | |
231 | 104 | |
232 | 105 | /* |
233 | 106 | * 分割点で分割したウェイをつなぐ |
234 | 107 | */ |
235 | 108 | 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 | + | |
331 | 111 | /* |
332 | 112 | * 分割されたWAYを接続してエリアを構成します。 |
333 | 113 | */ |
@@ -357,6 +137,15 @@ public class RelationCutter { | ||
357 | 137 | processLat(con, way, -1, relationid); |
358 | 138 | } |
359 | 139 | |
140 | + /** | |
141 | + * 東西方向の分割点同士を接続する | |
142 | + * | |
143 | + * @param con | |
144 | + * @param way | |
145 | + * @param order | |
146 | + * @param relationid | |
147 | + * @throws SQLException | |
148 | + */ | |
360 | 149 | public static void processLat(Connection con, Way way, int order, long relationid) throws SQLException { |
361 | 150 | OsmNode lastnode = way.waynodes.get(way.waynodes.size() - 1); // 最終のノード |
362 | 151 | String sql; |
@@ -430,13 +219,14 @@ public class RelationCutter { | ||
430 | 219 | } |
431 | 220 | |
432 | 221 | /** |
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> | |
436 | 225 | * @param con |
437 | - * @param before | |
438 | - * @param osmnode | |
439 | - * @return | |
226 | + * @param startNode | |
227 | + * @param firstway | |
228 | + * @param relationid | |
229 | + * @return 最後のWAY | |
440 | 230 | * @throws IOException |
441 | 231 | * @throws SQLException |
442 | 232 | */ |
@@ -479,7 +269,7 @@ public class RelationCutter { | ||
479 | 269 | * ただし、Wayの最初のNODEは対象外とする |
480 | 270 | * @param way |
481 | 271 | * @param node |
482 | - * @return | |
272 | + * @return ノードが含まれていればtrue | |
483 | 273 | */ |
484 | 274 | static boolean includeNodeWithoutStart(Way way, OsmNode node) { |
485 | 275 | for (int i=1; i < way.waynodes.size(); i++) { |
@@ -642,11 +432,291 @@ public class RelationCutter { | ||
642 | 432 | iCounter += importNodes(con, root, iStr.substring(0, iStr.length() - 4), timeStampStr, 0L); |
643 | 433 | Logger.logger.info("relation counter = ["+ iCounter +"]"); |
644 | 434 | } |
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 | + } | |
645 | 715 | |
646 | 716 | /** |
647 | 717 | * ローカルデータベース内の情報を出力する |
648 | 718 | * @param con |
649 | - * @param iCode | |
719 | + * @param outputFileName | |
650 | 720 | * @throws IOException |
651 | 721 | * @throws SQLException |
652 | 722 | */ |
@@ -682,7 +752,7 @@ public class RelationCutter { | ||
682 | 752 | * @param node |
683 | 753 | * @param iFileName // ソースファイル名(拡張子を含まない) |
684 | 754 | * @param timeStampStr |
685 | - * @return | |
755 | + * @return インポートしたノード数 | |
686 | 756 | * @throws IOException |
687 | 757 | * @throws SQLException |
688 | 758 | */ |
@@ -932,9 +1002,11 @@ public class RelationCutter { | ||
932 | 1002 | |
933 | 1003 | /** |
934 | 1004 | * |
935 | - * <nd ref=''/> | |
1005 | + * <pre><nd ref=''/></pre> | |
936 | 1006 | * @param con |
937 | 1007 | * @param node |
1008 | + * @param id | |
1009 | + * @param ndCounter | |
938 | 1010 | * @throws IOException |
939 | 1011 | * @throws SQLException |
940 | 1012 | */ |
@@ -954,10 +1026,11 @@ public class RelationCutter { | ||
954 | 1026 | } |
955 | 1027 | |
956 | 1028 | /** |
957 | - * create new OSMNODE in database | |
1029 | + * OSMNODEインスタンスをローカルデータベースに追加する | |
1030 | + * | |
958 | 1031 | * @param con |
959 | 1032 | * @param node |
960 | - * @return | |
1033 | + * @return 追加したNODEのIDREF | |
961 | 1034 | * @throws IOException |
962 | 1035 | * @throws SQLException |
963 | 1036 | */ |
@@ -978,10 +1051,11 @@ public class RelationCutter { | ||
978 | 1051 | } |
979 | 1052 | |
980 | 1053 | /** |
981 | - * create new WAY in database | |
1054 | + * WAYインスタンスをデータベースに追加する | |
1055 | + * | |
982 | 1056 | * @param con |
983 | 1057 | * @param way |
984 | - * @return | |
1058 | + * @return 追加したWAYのID | |
985 | 1059 | * @throws IOException |
986 | 1060 | * @throws SQLException |
987 | 1061 | */ |
@@ -1007,10 +1081,10 @@ public class RelationCutter { | ||
1007 | 1081 | } |
1008 | 1082 | |
1009 | 1083 | /** |
1010 | - * create new WAY in database | |
1084 | + * MEMBERインスタンスをローカルデータベースに追加します | |
1011 | 1085 | * @param con |
1012 | - * @param way | |
1013 | - * @return | |
1086 | + * @param member | |
1087 | + * @return 追加したMEMBERのIDREF | |
1014 | 1088 | * @throws IOException |
1015 | 1089 | * @throws SQLException |
1016 | 1090 | */ |