【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をコピーしました