↧
D3.js(主に地図)の勉強会を行います。
↧
Google Maps APIで緯度経度を元にプロットしたマーカーの位置がずれる(測地系変換)

サンプル
[javascript] //日本測地系の宣言 Proj4js.defs['EPSG:4301'] = "+proj=longlat +ellps=bessel +towgs84=-146.336,506.832,680.254,0,0,0,0 + no_defs"; //Proj4jsエラー発生時の動作を登録 Proj4js.reportError = function(msg) {console.log(msg);} //日本測地系から世界測地系への変換関数 function transformJ2W(lon,lat){ var source = new Proj4js.Proj('EPSG:4301'); var dest = new Proj4js.Proj('EPSG:4326'); var p = new Proj4js.Point( lon , lat); Proj4js.transform(source, dest, p); return p; } //日本測地系から世界測地系への変換 var j2w = transformJ2W(long, lat); //変換 console.log([j2w.y, j2w.x]) //変換した値を出力 [/javascript] とりあえず、1000件ほど試してみたところ、まぁ、許容範囲ではないかというところまでズレが直ったので良しとしました。
↧
↧
オープデータを公開している都市に色を塗ってみた。
↧
D3.js勉強会(地図入門)を開催しました。

↧
地理院地図の地図タイルを使ったD3.js&Cesiumサンプル
D3ラスタータイルサンプル
[html] <script src="http://d3js.org/d3.v3.min.js"></script> <script src="http://d3js.org/d3.geo.tile.v0.min.js"></script> [/html] [javascript] (function(){ var width = Math.max(960, window.innerWidth); var height = Math.max(500, window.innerHeight); var tile = d3.geo.tile().size([width, height]); var minZoomLevel = 14; var maxZoomLevel = 20; var projection = d3.geo.mercator() .scale((1 << minZoomLevel) / 2 / Math.PI) .translate([width / 2, height / 2]); var center = projection([139.3555791,34.7500396]); var svg = d3.select("svg") .attr({ "width": width, "height": height }); var raster = svg.append("g"); var zoomed = function() { var tiles = tile .scale(zoom.scale()) .translate(zoom.translate()) (); var image = raster .attr("transform", "scale(" + tiles.scale + ")translate(" + tiles.translate + ")") .selectAll("image").data(tiles, function(d) { return d; }); image.exit().remove(); image.enter().append("image") .attr("xlink:href", function(d) { return "http://cyberjapandata.gsi.go.jp/xyz/std/"+d[2]+"/"+d[0]+"/"+d[1]+".png"; }) .attr({ "width": 1, "height": 1, "x": function(d) { return d[0]; }, "y": function(d) { return d[1]; } }) } var zoom = d3.behavior.zoom() .scale(projection.scale() * 2 * Math.PI) .scaleExtent([1 << minZoomLevel, 1 << maxZoomLevel]) //スケールの最小値、最大値指定 .translate([width - center[0], height - center[1]]) .on("zoom", zoomed); projection .scale(1 / 2 / Math.PI) .translate([0, 0]); svg.call(zoom); zoomed(); })(); [/javascript] まぁ、ラスター地図を表示するなら素直にOpenLayersやLeaflet使った方が良いと思いますが。
cesium 3D地図サンプル
※WebGLに対応/有効にしたブラウザでないと見れません。 [javascript] var widget = new Cesium.CesiumWidget('cesiumContainer', { imageryProvider : new Cesium.OpenStreetMapImageryProvider({ url : 'http://cyberjapandata.gsi.go.jp/xyz/std/', //地理院地図を指定 credit : '地理院地図' }) }); [/javascript] ちょー簡単! OpenLayersのサイトを見ていたら、OpenLayers 3.0にはCesiumライブラリも含まれるらしいので、今のうちに勉強しておいてもいいかもしれません。
↧
↧
D3.jsで読み込んだgeoJSONデータをthree.jsを使って3D表示する。

サンプル
d3-threeDというライブラリを使用しています。 [javascript] d3.json("japan.geojson", function(json) { d3main(json); }); function d3main(json) { var container; var camera, scene, renderer; var mesh; initScene(); function initScene() { container = document.createElement('div'); document.body.appendChild(container); //シーンの追加 scene = new THREE.Scene(); //カメラの設定 camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 10000); camera.position.set(0, 0, 300); controls = new THREE.TrackballControls( camera ); scene.add(camera); //ライティングの設定 var light = new THREE.DirectionalLight(0xffffff, 2); light.position.set(1, 1, 1).normalize(); scene.add(light); //目印用のキューブを追加 var geometry = new THREE.CubeGeometry(20, 20, 20); var material = new THREE.MeshLambertMaterial({color:0x0000ff}) mesh = new THREE.Mesh(geometry, material); scene.add(mesh); //geojsonデータ読み込み var geodata = json.features; //投影法指定 var mercator = d3.geo.equirectangular(); //path変換関数生成 var path = d3.geo.path().projection(mercator); //表示位置調整 var translate = mercator.translate(); translate[0] = -2200; translate[1] = 550; mercator.translate(translate); //スケール指定 mercator.scale(900); //geoJSON→svg path→three.js mesh変換 var countries = []; for (i = 0 ; i < geodata.length ; i++) { var geoFeature = geodata[i]; var properties = geoFeature.properties; var feature = path(geoFeature); //svgパスをthree.jsのmeshに変換 var gmesh = transformSVGPathExposed(feature); for (j = 0 ; j < gmesh.length ; j++) { countries.push({"data": properties, "mesh": gmesh[j]}); } } //mesh追加 for (i = 0 ; i < countries.length ; i++) { var material = new THREE.MeshPhongMaterial({ color: Math.floor(Math.random() * 0xFFFFFF), opacity:1 }); var shape3d = countries[i].mesh.extrude({ amount: 20, bevelEnabled: false }); var toAdd = new THREE.Mesh(shape3d, material); toAdd.rotation.x = 60; scene.add(toAdd); } //レンダリング renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); container.appendChild(renderer.domElement); renderer.render(scene, camera); animate(); } function animate() { requestAnimationFrame( animate ); renderer.render( scene, camera ); controls.update(); } } [/javascript] 表示位置の調整とかが結構面倒でした。 amountで無理やり厚みを付けているので、あんまり綺麗に表示できてません。 ちゃんと使いこなすには、Three.jsを勉強しないとならないですね。
↧
【D3.js&Three.js】各都道府県の人口に合わせて高さを変えてみた(3D地図)

サンプル
[javascript] d3.json("japan.geojson", function(json) { d3main(json); }); function d3main(json) { var container; var camera, scene, renderer; var mesh; initScene(); function initScene() { container = document.createElement('div'); document.body.appendChild(container); //シーンの追加 scene = new THREE.Scene(); //カメラの設定 camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 10000); camera.position.set(0, 0, 200); controls = new THREE.TrackballControls( camera ); scene.add(camera); //ライティングの設定 var light = new THREE.DirectionalLight(0xffffff, 2); light.position.set(1, -4, 1).normalize(); scene.add(light); //geojsonデータ読み込み var geodata = json.features; //投影法指定 var mercator = d3.geo.equirectangular(); //path変換関数生成 var path = d3.geo.path().projection(mercator); //表示位置調整 var translate = mercator.translate(); translate[0] = -2200; translate[1] = 550; mercator.translate(translate); //スケール指定 mercator.scale(900); var max = d3.max(geodata, function(d){ return +d.properties['jinkou_人口']}) var colorScale = d3.scale.linear().domain([0, max]).range(["#00cc00", "#cc0000"]); var amountScale = d3.scale.linear().domain([0, max]).range([0, 60]); //geoJSON→svg path→three.js mesh変換 var countries = []; for (i = 0 ; i < geodata.length ; i++) { var geoFeature = geodata[i]; var properties = geoFeature.properties; var feature = path(geoFeature); //svgパスをthree.jsのmeshに変換 var gmesh = transformSVGPathExposed(feature); for (j = 0 ; j < gmesh.length ; j++) { countries.push({"data": properties, "mesh": gmesh[j]}); } } //mesh追加 for (i = 0 ; i < countries.length ; i++) { var color = colorScale(countries[i].data['jinkou_人口']); var material = new THREE.MeshPhongMaterial({ color: color, opacity:0.9 }); var amount = ~~(amountScale(countries[i].data['jinkou_人口'])); var shape3d = countries[i].mesh.extrude({ amount: amount, bevelEnabled: false }); var toAdd = new THREE.Mesh(shape3d, material); toAdd.rotation.x = 60; toAdd.position.z = - ~~(60 - amount); scene.add(toAdd); } //レンダリング renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); container.appendChild(renderer.domElement); renderer.render(scene, camera); animate(); } function animate() { requestAnimationFrame( animate ); renderer.render( scene, camera ); controls.update(); } } [/javascript]
↧
Google Earthを使ったストーリマップをブラウザ上で作成できるサービス「Tour Builder」


↧
【D3.js】SVGで作成した都道府県の地形を並べて表示する

サンプル
[javascript highlight="26,27-32,33"] d3.json("japan.geojson", function(json) { d3main(json); }); function d3main(json){ var geodata = json.features; projection = d3.geo .mercator() //投影法の指定 .scale(1500) //スケール(ズーム)の指定 .translate([300,350]) .center([139.0032936, 36.3219088]); //中心の座標を指定 var path = d3.geo.path().projection(projection); //投影 var svg = d3.select("svg"); var map = svg.append("svg:g") .selectAll("path") .data(geodata) .enter() .append("g") .attr("transform", function(d, i){ var center = path.centroid(d); //中心点取得 var x = ~~center[0]; var y = ~~center[1]; var nx = Math.floor(i%10) * 150 + 100; //並び位置(x軸) var ny = Math.floor(i/10) * 120 + 100; //並び位置(y軸) //中心点分を引いて一度座標をx=0,y=0に戻す。その後nx,nyの位置に表示 return "translate(-"+x+",-"+y+"),translate("+nx+","+ny+")"; }) .append("svg:path") .attr({ "d": path, "fill": "green", "fill-opacity": 0.5, "stroke": "black" }) .append("title") .text(function(d){ return d.properties.PREF }) } [/javascript]↧
↧
ベクタータイルマップの紹介
正直なところ、ブログのタイトルに「GIS」と掲げながら、GISの勉強があまり進んでいない(D3ばっか弄っていた一年だった)ので、ネタが見つからなかったのですが、せっかくお誘いいただいた話なので、D3周辺で見つけたGISにかかわりがありそうな技術について紹介してみようと思います。 D3.jsを使ったベクタータイルマップです。


↧
福岡市のオープンデータを使用して交通危険個所マップを作成しました。
最近のオープンデータ促進の流れを受けて、いくつかの自治体でデータの公開がおこなわれています。 その中の一つ、福岡市のオープンデータ(サンプル)にて公開されている交通危険個所データをGoogle Map上にヒートマップとして表示してみました。

↧
地理空間情報作成・編集・共有サイト「geojson.io」

↧
Google Map上に画像を配置する

サンプル
[javascript] function initialize() { //Google Maps API初期化 geocoder = new google.maps.Geocoder(); var mapOptions = { zoom: 15, center: new google.maps.LatLng(36.3219088, 139.0032936), mapTypeId: google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); //マップ上の表示領域が変化した際の処理 google.maps.event.addListener(map, 'bounds_changed', function() { var latOutput = document.getElementById('lat'); var lngOutput = document.getElementById('lng'); var swlatOutput = document.getElementById('swlat'); var swlngOutput = document.getElementById('swlng'); //北東緯度経度表示エレメント var nelatOutput = document.getElementById('nelat'); var nelngOutput = document.getElementById('nelng'); var latlngBounds = map.getBounds(); //マップ中心の緯度経度取得 var centerLatlng = latlngBounds.getCenter(); var ceLat = centerLatlng.lat(); var ceLng = centerLatlng.lng(); latOutput.innerText = ceLat; lngOutput.innerText = ceLng; //マップ南西の緯度経度取得 var swLatlng = latlngBounds.getSouthWest(); var swlat = swLatlng.lat(); var swlng = swLatlng.lng(); swlatOutput.innerText = swlat; swlngOutput.innerText = swlng; //マップ北東の緯度経度取得 var neLatlng = latlngBounds.getNorthEast(); var nelat = neLatlng.lat(); var nelng = neLatlng.lng(); nelatOutput.innerText = nelat; nelngOutput.innerText = nelng; }); var bounds = new google.maps.LatLngBounds(); //画像の配置位置指定 bounds.extend(new google.maps.LatLng(36.3068070483715,138.95191292059326)); bounds.extend(new google.maps.LatLng(36.361153624185235,139.06435112249756)); //画像をグラウンドオーバーレイとして追加 var groundOverlay = new google.maps.GroundOverlay("http://www.police.pref.gunma.jp/seianbu/01seiki/hanzaimap/images/jyutaku/takasaki-s.jpg", bounds, { map : map, opacity : 0.3, clickable : true }); //地図を表示 map.fitBounds(bounds); //グラウンドオーバーレイがクリックされたら、透明度を変更 google.maps.event.addListener(groundOverlay, "click", toggle(show, hide)); function show(){ groundOverlay.setOpacity(1); } function hide(){ groundOverlay.setOpacity(0.5); } } google.maps.event.addDomListener(window, 'load', initialize); function toggle(){ var fn = arguments; var l = arguments.length; var i = 0; return function(){ if(l <= i) i=0; fn[i++](); } } [/javascript]
↧
↧
GISの参考書はどこにあるのか?

QGIS自習室 (GISデータと空間参照システム)
posted with amazlet at 13.12.26
(2013-11-06)
売り上げランキング: 3,191
売り上げランキング: 3,191
QGIS自習室 (個別値主題図とラベル主題図)
posted with amazlet at 13.12.26
(2013-11-24)
売り上げランキング: 3,404
売り上げランキング: 3,404
↧
D3.js勉強会(地図入門)を開催しました。
example D3.js勉強会(地図入門)が無事終了しました。 前回は、ネタ不足で時間が余りましたが、今回はそんなこともなくそれなりに内容のある勉強会になったのではないかと。 逆に時間が足りず伝えきれなかった部分もある […]
↧
【D3.js】地図をデザインする
example 下記記事を参考に、ちょっとオシャレな感じの日本地図を作成してみました。 GeoExamples: D3 map Styling tutorial II: Giving style to the base […]
↧
ストーリーマップが簡単に作成できるサービス「StoryMapJS」
ストーリーマップ エディタ ストーリーマップを作成できるサービスがあったので紹介します。 今のところβ版で、利用するにはGoogle のアカウントが必要です。 StoryMapJS 住所等で検索し、画像や動画を登録して記 […]
↧
↧
前橋市には、男子より女子の方が多く住んでいる。
example 男子の人口を、女子の人口が上回る地域が多数。 概要 前橋市オープンデータライブラリーにて公開されている「町丁ごとの年齢別人口構成推移」を利用させていただきました。 地域ごとに男性の人口と女性の人口を比較し […]
↧
3Dコロプレスマップ(塗り分け地図)が簡単に作成できる「GeoCanvas」
「GeoCanvas」は、わずか数ステップで地理空間情報を読み込んで3Dのコロプレスマップを作成できるアプリケーションです。実際の動作については下記動画を。 使ってみた というわけで、とりあえずインストールして使ってみた […]
↧
【D3.js】隣接する区画を表示する
example こちらのサンプルを見て日本地図版を作ってみました。 マウスオーバーした市に隣接する市区町村がオレンジ色で表示されます。 サンプル ポリゴン数の少ないデータの方が内容を理解しやすいので、都道府県版のサンプル […]
↧