【mapbox js】csvデータをJSで読み取りたい①

mapboxのアイコン画像 javascript

こんにちは.
今回はmapbox上にcsvデータを読み取って扱う方法について書き記したいと思います.

対象とする人

  • csvデータを読み取ってmapboxに反映させたい人
  • サーバーを持っていない人(phpを使わずに作業したい人)

javascriptだけでcsvを読み取るのは少し大変で,フォルダの中にあるものを勝手に読み取ることはできません.そこで,外部からファイルをインポートする形で実装していきます.

概要

ここではポリゴンデータを用意して,csvのデータを使って色を塗り分けていきます.

使用コード

用意した地図はこれです.この中にはすでにポリゴンデータが入っています.

表示するために書いたコートはこんな感じ.

<html> <head> <script src='https://api.mapbox.com/mapbox-gl-js/v2.6.1/mapbox-gl.js'></script> <script src='https://cafelogram.com/blog/jsondata/testTile.js'></script> <link href='https://api.mapbox.com/mapbox-gl-js/v2.6.1/mapbox-gl.css' rel='stylesheet' /> </head> <div id='map' style='width: 400px; height: 400px;'></div> <script> mapboxgl.accessToken = accesToken; var map = new mapboxgl.Map({ container: 'map', style: 'mapbox://styles/mapbox/streets-v11', // マップのスタイル(デザイン) center: [139.7671, 35.6812], zoom: 4 }); map.on('load',() => { map.addSource('_tile',{ 'type':'geojson', 'data':testTile }); map.addLayer({ 'id':'tile_data', 'type':'fill', 'source':'_tile', 'paint':{ 'fill-color':'#009944', 'fill-opacity':0.8 } }); }); </script> </html>
Code language: HTML, XML (xml)

使用csv

あと用いるcsvですね.これはこんな感じのやつにしました.

入れたポリゴンデータにidが1-4まで振られているのでそれに対応したcsvを用意しました.


値は適当です.
一応に種類用意しましたが,多分一種類しか使いません.

実装

では,前提のコードを編集していきます.

csvの読み取り

読み取りフォームの作成

まず,htmlにcsvを読み取るためのフォームを作成します.

<form name="myform"> <label>CSV Form</label><input name="displayCSV" type="file" accept=".csv"/> </form>
Code language: HTML, XML (xml)

labelの中身やnameは適当に決めてください.

デザインは全く考えていないのでcssとか使ってなんとかしてください

csvを読み取る

先程のフォームでインポートしたcsvをjavascriptを使って読み取ります.
使用するコードはこちら

//Form要素を取得する var form = document.forms.myform; //csvの結果を格納する配列 var _result = []; //ファイルが読み込まれた時の処理 form.displayCSV.addEventListener('change', function(e) { //CSVを1行ずつ読み込む var result = e.target.files[0]; //FileReaderのインスタンスを作成する var reader = new FileReader(); //読み込んだファイルの中身を取得する reader.readAsText( result ); //ファイルの中身を取得後に処理を行う reader.addEventListener( 'load', function() { let lines = reader.result.split(/\r\n|\n|\r/g); let table = lines.map(function(line){  return line.split(','); }); _result = table; }) });
Code language: JavaScript (javascript)

ハイライトをつけた部分は「[2行目の変数名].[htmlのinputタグにつけたname].addEvent…」となっています.
結果的に_resultという配列にcsvのデータが格納されるようになっています.

つまるところ_resultのデータを使ってポリゴンデータを塗り分けていくことになりまうす.

今日作成したコードはこんな感じ.

<html> <head> <script src='https://api.mapbox.com/mapbox-gl-js/v2.6.1/mapbox-gl.js'></script> <script src='https://cafelogram.com/blog/jsondata/testTile.js'></script> <link href='https://api.mapbox.com/mapbox-gl-js/v2.6.1/mapbox-gl.css' rel='stylesheet' /> </head> <script type="text/javascript"> //Form要素を取得する var form = document.forms.myform; //csvの結果を格納する配列 var _result = []; //ファイルが読み込まれた時の処理 form..addEventListener('change', function(e) { //CSVを1行ずつ読み込む var result = e.target.files[0]; //FileReaderのインスタンスを作成する var reader = new FileReader(); //読み込んだファイルの中身を取得する reader.readAsText( result ); //ファイルの中身を取得後に処理を行う reader.addEventListener( 'load', function() { let lines = reader.result.split(/\r\n|\n|\r/g); let table = lines.map(function(line){  return line.split(','); }); _result = table; }) }); </script> <body> <!-- html追加部分 start--> <form name="myform"> <label>CSV Form</label><input name="displayCSV" type="file" accept=".csv"/> </form> <!-- html追加部分 end--> <div id='map' style='width: 400px; height: 400px;'></div> </body> <script> mapboxgl.accessToken = 'アクセストークン'; var map = new mapboxgl.Map({ container: 'map', style: 'mapbox://styles/mapbox/streets-v11', // マップのスタイル(デザイン) center: [139.7671, 35.6812], zoom: 4 }); map.on('load',() => { map.addSource('_tile',{ 'type':'geojson', 'data':testTile }); map.addLayer({ 'id':'tile_data', 'type':'fill', 'source':'_tile', 'paint':{ 'fill-color':'#009944', 'fill-opacity':0.8 } }); }); </script> </html>
Code language: HTML, XML (xml)

htmlで見るとこんな感じ

今日は疲れたのでここまで.

コメント

タイトルとURLをコピーしました