var width = 900, height = 650; var svg = null; var areas = new Array(); // エリア情報 window.onload = function() { // 2014/01/01 の「気象警報・注意報」を取得 var url = "http://api.aitc.jp/jmardb-api/search?title=" + encodeURIComponent("気象警報・注意報") + "&datetime=2014-01-01%2000:00:00&datetime=2014-01-01%2023:59:59&path=/report/head/headline/information&limit=100&offset=0"; console.log(url); // 同期通信 json = getJson(url); // グルグル回して、全部を取ってくる var alldata = json.data; for (var i = 0 ; i < 100 ; i++){ // 安全装置。100回以上はループさせない nexturl = json.paging.next; console.log(nexturl); url += "\n" + nexturl; if (nexturl == null) break; // 次が無ければ、ループ終了 json = getJson(nexturl); alldata = alldata.concat(json.data); // 元のデータと結合 } // デバッグ表示 /* d3.select("#view").append("pre") .text(url + "\n---------------------------------------------------\n" + JSON.stringify(alldata, null, 2)); */ console.log(alldata); // ■■ pathの書き方とarea.codeの位置は、気象庁XMLの種類によって違う。 // ■■ ただし、気象庁XMLを見ただけでは分からない // 気象警報・注意報の場合、特定のdata.fragment.type だけ使うので、それ以外は削除 // 「気象警報・注意報(市町村等)」(一番粒度の細かいもの)以外は削除 alldata.forEach(function(data){ // console.log(data); if (data.fragment == null) return; var newFragment = new Array(); data.fragment.forEach(function(fragment){ // console.log(fragment); if (fragment.type != "気象警報・注意報(市町村等)") return; newFragment.push(fragment); }); data.fragment = newFragment; }); // データ中から、area.codeを抽出 alldata.forEach(function(data){ // console.log(data); if (data.fragment == null) return; data.fragment.forEach(function(fragment){ // console.log(fragment); fragment.item.forEach(function(item){ // console.log(item); item.areas.area.forEach(function(area){ // console.log(area); if (areas[area.code] == null){ areas[area.code] = area; } }); }); }); }); console.log("検索APIから取得した全area"); console.log(areas); // 緯度・経度が分からないものだけ、取得する var requestArea = new Array(); for (var code in areas) { var area = areas[code]; if (area.points == null){ requestArea.push(area); if (requestArea.length > 100){ // 取得したいareaが貯まった var url = "http://api.aitc.jp/jmardb-api/area"; for (var i = 0 ; i < requestArea.length ; i++){ if (i == 0){ url += "?"; } else { url += "&"; } url += "code=" + requestArea[i].code; } console.log(url); // リクエスト json = getJson(url); console.log(json); // 取得結果を格納 mergeAreas(areas, json); requestArea = new Array(); // リクエスト用リストを初期化 } } } // 未リクエストのものも、リクエストする if (requestArea.length > 0){ var url = "http://api.aitc.jp/jmardb-api/area"; for (var i = 0 ; i < requestArea.length ; i++){ if (i == 0){ url += "?"; } else { url += "&"; } url += "code=" + requestArea[i].code; } console.log(url); // リクエスト json = getJson(url); console.log(json); // 取得結果を格納 mergeAreas(areas, json); requestArea = new Array(); // リクエスト用リストを初期化 } /* // areasをデバッグ表示 console.log("位置情報が取れたarea"); for (var code in areas) { if (areas[code].points != null){ console.log(areas[code]); } } */ // D3.jsで描画する用のデータを作成する var points = new Array(); alldata.forEach(function(data){ // console.log(data); if (data.fragment == null) return; data.fragment.forEach(function(fragment){ // console.log(fragment); fragment.item.forEach(function(item){ // console.log(item); var kindname = ""; item.kind.forEach(function(kind){ // console.log(kind); kindname += kind.name + ", "; }); item.areas.area.forEach(function(area){ // console.log(area); if (areas[area.code] != null & areas[area.code].points != null){ // 位置情報が分かったものだけ使う for (var i = 0 ; i < areas[area.code].points.length ; i++){ var point = areas[area.code].points[i]; points.push({kindname: kindname, name:area.name, longitude: point.longitude, latitude: point.latitude,}); } } }); }); }); }); console.log("Array()に変換したareas"); console.log(points); // 注意報・警報・解除を重ねて描画できるよう、別データにする var points1 = new Array(); // 注意報を抽出 var points2 = new Array(); // 警報を抽出 var points3 = new Array(); // 解除を抽出 points.forEach(function(point){ // console.log(point); if (point.kindname.indexOf("注意報") >= 0){ var p = JSON.parse(JSON.stringify(point)); // コピー p.type = "注意報"; points1.push(p); } if (point.kindname.indexOf("警報") >= 0){ var p = JSON.parse(JSON.stringify(point)); // コピー p.type = "警報"; points2.push(p); } if (point.kindname.indexOf("解除") >= 0){ var p = JSON.parse(JSON.stringify(point)); // コピー p.type = "解除"; points3.push(p); } }); // 再結合 points = new Array(); points = points.concat(points3); // 一番下に解除 points = points.concat(points1); // 次に注意報 points = points.concat(points2); // 一番上に警報 console.log("D3.jsで描画するデータ"); console.log(points); // 取得した緯度・経度を描画 svg = d3.select("#view").append("svg") //