OSDN Git Service

RELEASE: 2015-02-21
[convbusstop/convbusstop.git] / src / osm / jp / api / HttpGET.java
1 package osm.jp.api;\r
2 \r
3 import java.net.*;\r
4 import java.io.*;\r
5 \r
6 import javax.xml.parsers.DocumentBuilder;\r
7 import javax.xml.parsers.DocumentBuilderFactory;\r
8 import javax.xml.parsers.ParserConfigurationException;\r
9 \r
10 import org.w3c.dom.NamedNodeMap;\r
11 import org.w3c.dom.Node;\r
12 import org.w3c.dom.NodeList;\r
13 import org.xml.sax.SAXException;\r
14 \r
15 /**\r
16  * Java HTTP クライアントサンプル - HttpURLConnection 版 -\r
17  *\r
18  * @author 68user http://X68000.q-e-d.net/~68user/\r
19  */\r
20 public class HttpGET {\r
21         //public static String host = "http://api06.dev.openstreetmap.org";\r
22         public static String host = "http://api.openstreetmap.org";\r
23         \r
24         public static void main(String[] args) throws MalformedURLException, ProtocolException, IOException {\r
25         getCapabilities();\r
26         \r
27         /*\r
28                 <node id="-4131" timestamp="2011-01-21T16:47:41Z" lat="35.4350644157973" lon="139.423684433498">\r
29                         <tag k="name" v="あやせ荘"/>\r
30                 </node>\r
31                 <node id="-4152" timestamp="2011-01-21T16:47:41Z" lat="35.4341675801122" lon="139.418362759267">\r
32                         <tag k="name" v="武者奇橋"/>\r
33                 </node>\r
34                 <node id="-4155" timestamp="2011-01-21T16:47:41Z" lat="35.4369651010672" lon="139.426400070915">\r
35                         <tag k="name" v="綾瀬市役所"/>\r
36                 </node>\r
37          */\r
38 \r
39         double minlon = 139.4197591d;\r
40                 double maxlon = 139.4279939d;\r
41                 double minlat = 35.4320438d;\r
42                 double maxlat = 35.4375923d;\r
43                 HttpGET.getMap(minlon, minlat, maxlon, maxlat);\r
44         \r
45                 HttpGET.getMap(35.4350644157973d, 139.423684433498d, 50);       // あやせ荘\r
46                 HttpGET.getMap(35.4341675801122d, 139.418362759267d, 50);       // 武者奇橋\r
47                 HttpGET.getMap(35.4369651010672d, 139.426400070915d, 50);       // 綾瀬市役所\r
48     }\r
49         \r
50         public static void getCapabilities() throws MalformedURLException, ProtocolException, IOException {\r
51                 System.out.println(host + "/api/capabilities");\r
52         URL url = new URL(host + "/api/capabilities");\r
53 \r
54         HttpURLConnection urlconn = (HttpURLConnection)url.openConnection();\r
55         urlconn.setRequestMethod("GET");\r
56         urlconn.setInstanceFollowRedirects(false);\r
57         urlconn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3");\r
58         urlconn.connect();\r
59 \r
60         System.out.println("レスポンスコード[" + urlconn.getResponseCode() + "] " +\r
61                            "レスポンスメッセージ[" + urlconn.getResponseMessage() + "]");\r
62         System.out.println("\n---- ボディ ----");\r
63 \r
64         BufferedReader reader = new BufferedReader(new InputStreamReader(urlconn.getInputStream()));\r
65 \r
66         while (true){\r
67             String line = reader.readLine();\r
68             if ( line == null ){\r
69                 break;\r
70             }\r
71             System.out.println(line);\r
72         }\r
73 \r
74         reader.close();\r
75         urlconn.disconnect();\r
76         }\r
77         \r
78 \r
79         public static final double BIG_Y = (6378137.0d + 6356752.314d) / 2d;    // 地球の平均半径(m)\r
80         public static final double LAT1 = Math.PI * 2d * BIG_Y / 360d;                  // 緯度1度の距離(m)\r
81         public static int getMap(double lat, double lon, int m) throws MalformedURLException, ProtocolException, IOException {\r
82                 double dLat = m / LAT1;                                         // 距離を表す緯度(差分)\r
83                 double minlat = lat - dLat;             // 底辺(緯度)\r
84                 double maxlat = lat + dLat;             // 上辺(緯度)\r
85                 \r
86                 double y = Math.cos(lat / 180.0d * Math.PI) * BIG_Y;    // 緯線上の地球の半径\r
87                 double lon1 = (y * 2.0d * Math.PI) / 360;                       // 経度1度の距離(m)\r
88                 double dLon = m / lon1;                                         // 距離を表す経度(差分)\r
89                 double minlon = lon - dLon;             // 左辺\r
90                 double maxlon = lon + dLon;             // 右辺\r
91 \r
92                 System.out.println("緯線上の地球の半径= "+ y);\r
93                 System.out.println("緯度1秒の長さ(m)= "+ LAT1 / 3600);\r
94                 System.out.println("経度1秒の長さ(m)= "+ lon1 / 3600);\r
95 \r
96                 return getMap(minlon, minlat, maxlon, maxlat);\r
97         }\r
98         \r
99         public static int getMap(RectArea center) throws MalformedURLException, ProtocolException, IOException {\r
100                 return getMap(center.minlon, center.minlat, center.maxlon, center.maxlat);\r
101         }\r
102         \r
103         public static int getMap(double minlon, double minlat, double maxlon, double maxlat) throws MalformedURLException, ProtocolException, IOException {\r
104                 String param = host + "/api/0.6/map" + "?bbox="+ Double.toString(minlon) +","+ Double.toString(minlat) +","+ Double.toString(maxlon) +","+ Double.toString(maxlat);\r
105 \r
106                 System.out.println(param);\r
107         URL url = new URL(param);\r
108 \r
109         HttpURLConnection urlconn = (HttpURLConnection)url.openConnection();\r
110         urlconn.setRequestMethod("GET");\r
111         urlconn.setInstanceFollowRedirects(false);\r
112         urlconn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3");\r
113         urlconn.connect();\r
114 \r
115         System.out.println("レスポンスコード[" + urlconn.getResponseCode() + "] " +\r
116                            "レスポンスメッセージ[" + urlconn.getResponseMessage() + "]");\r
117         System.out.println("\n---- ボディ ----");\r
118 \r
119         //------------------------------------------\r
120         DocumentBuilderFactory factory;\r
121                 DocumentBuilder        builder;\r
122                 Node root;\r
123 \r
124                 try {\r
125                         factory = DocumentBuilderFactory.newInstance();\r
126                         builder = factory.newDocumentBuilder();\r
127                         factory.setIgnoringElementContentWhitespace(true);\r
128                         factory.setIgnoringComments(true);\r
129                         factory.setValidating(true);\r
130                         root    = builder.parse(urlconn.getInputStream());\r
131 \r
132                         counter = 0;\r
133                         checkNodes(root);\r
134                 } catch (ParserConfigurationException e0) {\r
135                         System.out.println(e0.getMessage());\r
136                 } catch (SAXException e1){\r
137                         System.out.println(e1.getMessage());\r
138                 } catch (IOException e2) {\r
139                         System.out.println(e2.getMessage());\r
140                 }\r
141 \r
142                 System.out.println("バス停数["+ counter +"]");\r
143         urlconn.disconnect();\r
144         \r
145         return counter;\r
146         }\r
147         \r
148         public void sendCMD(String api) throws MalformedURLException, ProtocolException, IOException {\r
149                 System.out.println(host + api);\r
150         URL url = new URL(host + api);\r
151 \r
152         HttpURLConnection urlconn = (HttpURLConnection)url.openConnection();\r
153         urlconn.setRequestMethod("GET");\r
154         urlconn.setInstanceFollowRedirects(false);\r
155         urlconn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3");\r
156         urlconn.connect();\r
157 \r
158         System.out.println("レスポンスコード[" + urlconn.getResponseCode() + "] " +\r
159                            "レスポンスメッセージ[" + urlconn.getResponseMessage() + "]");\r
160         System.out.println("\n---- ボディ ----");\r
161 \r
162         BufferedReader reader = new BufferedReader(new InputStreamReader(urlconn.getInputStream()));\r
163 \r
164         while (true){\r
165             String line = reader.readLine();\r
166             if ( line == null ){\r
167                 break;\r
168             }\r
169             System.out.println(line);\r
170         }\r
171 \r
172         reader.close();\r
173         urlconn.disconnect();\r
174     }\r
175         \r
176         public static int counter;\r
177         public static void checkNodes(Node node) {\r
178                 if (isBusstop(node)) {\r
179                         counter++;\r
180                         showNode(node);\r
181                 }\r
182                 \r
183                 NodeList nodes = node.getChildNodes();\r
184                 for (int i=0; i<nodes.getLength(); i++) {\r
185                         Node node2 = nodes.item(i);\r
186                         checkNodes(node2);\r
187                 }\r
188         }\r
189         \r
190         /**\r
191          * [バス停]か?\r
192          * @param node\r
193          * @throws IOException\r
194          * @throws SQLException\r
195          */\r
196         public static boolean isBusstop(Node node) {\r
197                 NodeList nodes = node.getChildNodes();\r
198                 for (int i=0; i < nodes.getLength(); i++) {\r
199                         Node node2 = nodes.item(i);\r
200                         if (isBusstopTag(node2)) {\r
201                                 return true;\r
202                         }\r
203                 }\r
204                 return false;\r
205         }\r
206 \r
207         /**\r
208          * [bus_stop]タグか?\r
209          * @param node\r
210          * @return\r
211          */\r
212         private static boolean isBusstopTag(Node node) {\r
213                 if (node.getNodeName().equals("tag")) {\r
214                         boolean highway = false;\r
215                         boolean bus_stop = false;\r
216                         boolean public_transport = false;\r
217                         boolean plathome = false;\r
218                         boolean stop_position = false;\r
219                         NamedNodeMap nodeMap = node.getAttributes();\r
220                         if ( null != nodeMap ) {\r
221                                 for (int j=0; j < nodeMap.getLength(); j++ ) {\r
222                                         String key = nodeMap.item(j).getNodeName();\r
223                                         String value = nodeMap.item(j).getNodeValue();\r
224                                         if (key.equals("k") && value.equals("highway")){\r
225                                                 highway = true;\r
226                                         }\r
227                                         if (key.equals("k") && value.equals("public_transport")){\r
228                                                 public_transport = true;\r
229                                         }\r
230                                         if (key.equals("v") && value.equals("bus_stop")){\r
231                                                 bus_stop = true;\r
232                                         }\r
233                                         if (key.equals("v") && value.equals("plathome")){\r
234                                                 plathome = true;\r
235                                         }\r
236                                         if (key.equals("v") && value.equals("stop_position")){\r
237                                                 stop_position = true;\r
238                                         }\r
239                                 }\r
240                                 if (highway && bus_stop) {\r
241                                         return true;\r
242                                 }\r
243                                 if (public_transport && (plathome || stop_position)) {\r
244                                         return true;\r
245                                 }\r
246                         }\r
247                 }\r
248                 return false;\r
249         }\r
250 \r
251         /**\r
252          * 指定されたノードを再帰的に表示する。\r
253          * \r
254          * @param node\r
255          * @throws IOException\r
256          * @throws SQLException\r
257          */\r
258         public static void showNode(Node node) {\r
259                 System.out.print("<"+ node.getNodeName());\r
260                 NamedNodeMap nodeMap = node.getAttributes();\r
261                 if ( null != nodeMap ) {\r
262                         for ( int j=0; j < nodeMap.getLength(); j++ ) {\r
263                                 System.out.print(" "+ nodeMap.item(j).getNodeName() +"=\""+ nodeMap.item(j).getNodeValue() +"\"");\r
264                         }\r
265                 }\r
266 \r
267                 System.out.print(">"+ node.getNodeValue());\r
268                 \r
269                 NodeList nodes = node.getChildNodes();\r
270                 for (int i=0; i<nodes.getLength(); i++) {\r
271                         showNode(nodes.item(i));\r
272                 }\r
273                 System.out.println("</"+ node.getNodeName() +">");\r
274         }\r
275         \r
276         class RectArea {\r
277         public double minlon;\r
278         public double maxlon;\r
279         public double minlat;\r
280         public double maxlat;\r
281 \r
282         /**\r
283          * 矩形領域を中心点と中心点からの距離(メートル)でセットする\r
284          * \r
285          * @param lat   // 中心点の緯度\r
286          * @param lon   // 中心点の経度\r
287          * @param m             // 距離 領域の一辺の長さの半分\r
288          */\r
289                 public RectArea(double lat, double lon, int m) {\r
290                         double BIG_Y = (40000000.0d / 2.0d / Math.PI);          // 地球の半径\r
291                         double LAT1 = (10000000.0d / 90.0d);            // 緯度1度の距離(m)\r
292                         double dLat = m / LAT1;                                         // 距離を表す緯度(差分)\r
293                         minlat = lat - dLat;            // 底辺(緯度)\r
294                         maxlat = lat + dLat;            // 上辺(緯度)\r
295                         double y = Math.sin((90.0d - lat) / 180.0d) * BIG_Y;    // 緯線上の地球の半径\r
296                         double lon1 = y * 2.0d * Math.PI;                       // 経度1度の距離(m)\r
297                         double dLon = m / lon1;                                         // 距離を表す経度(差分)\r
298                         minlon = lon - dLon;            // 左辺\r
299                         maxlon = lon + dLon;            // 右辺\r
300                 }\r
301         }\r
302 }\r