LoginSignup
6
3

More than 1 year has passed since last update.

この記事はMIERUNE Advent Calendar 2021 4日目の記事です。

地理データの規格のひとつであるGeoJSONをp5.jsで描画してみます。

今回は座標系の話はしません。あくまでも"お絵かき"です。

atlas.png

GeoJSONの準備

地図のデータとなるGeoJSONを準備します。
geojson.ioというwebサービスを使ってgeojsonファイルを作成します。
今回はニュージーランドをトレースしてみました。画面右側のテキストエディタに表示されるjsonをnz.geojsonというファイル名で保存しておきます。

geojson_nz.png

nz.geojson
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [172.705078, -34.270835],
            [174.638671, -37.509725],
            [173.891601, -39.061849],
            [175.429687, -41.310823],
            [178.242187, -37.579412],
            [172.705078, -34.270835]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [172.353515, -40.713955],
            [166.596679, -45.521743],
            [168.706054, -46.739860],
            [171.694335, -43.897892],
            [174.155273, -41.442726],
            [172.353515, -40.713955]
          ]
        ]
      }
    }
  ]
}

JavaScriptでファイルを読み込むために、nz.geojsonのテキスト全体をブラケットで囲っておきます。

nz.geojson
[
  {
      "type": "FeatureCollection",
      "features": [...]
  }
]

これで地図データの用意は完了です。

sketch.jsを書く

GeoJSONの読み込み

p5.jsのpreload()を使ってGeoJSONを読み込んでおきます。

sketch.js
let boundary;

function preload(){
    boundary = loadJSON("nz.geojson");
}

地理データをキャンバスに描画する

  1. 読み込んだGeoJSONを解析し、各ポリゴンの頂点の経緯度座標を取得します。
  2. ニュージーランドは経度160から180度、緯度-50から-30度の範囲にあるので、map()を使ってキャンバスの範囲と調整します。
  3. beginShape()endShape()を使って形状を描画します。
sketch.js
let padding = 20;

function setup(){
    createCanvas(windowHeight, windowHeight);
    background('#67a5da');

    let geom;
    let polygons;
    let coords;
    let features = boundary[0].features;

    fill('#81b214');
    stroke('#fff');
    for (let i = 0; i < features.length; i++) {
        geom = features[i].geometry;
        polygons = geom.coordinates;
        coords = polygons[0];

        beginShape();
        for (let j = 0; j < coords.length; j++) {
            let lon = coords[j][0];
            let lat = coords[j][1];
            let x = map(lon, 160, 180, 0+padding, width-padding);
            let y = map(lat, -50, -30, height-padding, 0+padding);
            vertex(x,y);
        }
        endShape(CLOSE);
    }
}

ニュージーランドの絵が描けました!

p5js_nz.png

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3