dayjournal memo

Total 975 articles!!

OpenLayers #008 – GeoJSONで属性表示

Yasunori Kirimoto's avatar


画像



GeoJSONで属性表示をするメモ。



画像



dist/index.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>OpenLayers Starter</title>
</head>
<body>
    <div id="map"></div>

    <!--ポップアップ-->
    <div id="popup" class="ol-popup">
        <a href="#" id="popup-closer" class="ol-popup-closer"></a>
        <div id="popup-content"></div>
    </div>

    <script src="app.js"></script>
</body>
</html>


_resouce/css/style.css

html, body {
    height: 100%;
    padding: 0;
    margin: 0;
}

#map {
    z-index: 0;
    height: 100%;
}

/*ポップアップ設定*/
.ol-popup {
    position: absolute;
    background-color: white;
    -webkit-filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
    filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
    padding: 15px;
    border-radius: 10px;
    border: 1px solid #cccccc;
    bottom: 12px;
    left: -50px;
    min-width: 150px;
}
.ol-popup:after, .ol-popup:before {
    top: 100%;
    border: solid transparent;
    content: " ";
    height: 0;
    width: 0;
    position: absolute;
    pointer-events: none;
}
.ol-popup:after {
    border-top-color: white;
    border-width: 10px;
    left: 48px;
    margin-left: -10px;
}
.ol-popup:before {
    border-top-color: #cccccc;
    border-width: 11px;
    left: 48px;
    margin-left: -11px;
}

/*ポップアップ閉じるボタン*/
.ol-popup-closer {
    text-decoration: none;
    position: absolute;
    top: 2px;
    right: 8px;
}
.ol-popup-closer:after {
    content: "✖";
}


_resouce/js/script.js

import Map from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import XYZ from 'ol/source/XYZ';
import { fromLonLat } from 'ol/proj';

// GeoJSON読み込み
import VectorLayer from 'ol/layer/Vector';
import VectorSource from 'ol/source/Vector';
import GeoJSON from 'ol/format/GeoJSON';
import Style from 'ol/style/Style';
import Stroke from 'ol/style/Stroke';
import Fill from 'ol/style/Fill';
import Circle from 'ol/style/Circle';
import Overlay from 'ol/Overlay';

// 外部GeoJSONスタイル設定
const styles = {
    'Point': new Style({
        image: new Circle({
            radius: 10,
            stroke: new Stroke({
                color: 'rgba(52, 152, 219, 1.0)',
                width: 5
            }),
            fill: new Fill({
                color: 'rgba(52, 152, 219, 0.4)'
            })
        })
    }),
    'LineString': new Style({
        stroke: new Stroke({
            color: 'rgba(241, 196, 15, 0.6)',
            width: 5
        })
    }),
    'Polygon': new Style({
        stroke: new Stroke({
            color: 'rgba(255, 0, 0, 1.0)',
            width: 2
        }),
        fill: new Fill({
            color: 'rgba(255, 0, 0, 0.4)'
        })
    })
};
const styleFunction = function(feature) {
    return styles[feature.getGeometry().getType()];
};

// 外部GeoJSONソース設定
const vectorSource = new VectorSource({
    url: 'data/sample.geojson',
    format: new GeoJSON()
});

// 外部GeoJSONレイヤ設定
const vectorLayer = new VectorLayer({
    source: vectorSource,
    style: styleFunction
});


// ポップアップ設定
const container = document.getElementById('popup');
const content = document.getElementById('popup-content');
const closer = document.getElementById('popup-closer');
const overlay = new Overlay({
    element: container,
    autoPan: true,
    autoPanAnimation: {
        duration: 250
    }
});

// ポップアップ閉じる設定
closer.onclick = function() {
    overlay.setPosition(undefined);
    closer.blur();
    return false;
};


// MIERUNE MONO読み込み
const map = new Map ({
    target: 'map',
    layers: [
        new TileLayer({
            source: new XYZ({
                url: 'https://tile.mierune.co.jp/mierune_mono/{z}/{x}/{y}.png',
                attributions: 'Maptiles by <a href="http://mierune.co.jp" target="_blank">MIERUNE</a>, under CC BY. Data by <a href="http://osm.org/copyright" target="_blank">OpenStreetMap</a> contributors, under ODbL.',
                attributionsCollapsible: false,
                tileSize: [256, 256],
                minZoom: 0,
                maxZoom: 18
            })
        }),
        // ラインレイヤ指定
        vectorLayer
    ],
    // ポップアップ設定
    overlays: [overlay],
    view: new View ({
        center: fromLonLat([139.767, 35.681]),
        zoom: 14
    })
});


// クリックイベント
map.on('click', function(evt) {
    // ポップアップ表示
    map.forEachFeatureAtPixel(evt.pixel, function(feature, layer) {
        content.innerHTML =
            '<p>id: ' + feature.getProperties().id + '</p>' +
            '<p>name: ' + feature.getProperties().name + '</p>';
        overlay.setPosition(evt.coordinate);
    });
});

data/sample.geojson

{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "properties": {
                "id": "1",
                "name": "sample1"
            },
            "geometry": {
                "type": "Point",
                "coordinates":  [139.763, 35.681]
            }
        },
        {
            "type": "Feature",
            "properties": {
                "id": "2",
                "name": "sample2"
            },
            "geometry": {
                "type": "LineString",
                "coordinates": [
                    [139.75278854370114, 35.66413037753069],
                    [139.76523399353027, 35.67214927327908],
                    [139.77107048034668, 35.68888176518044],
                    [139.76660728454587, 35.69703758268826]
                ]
            }
        },
        {
            "type": "Feature",
            "properties": {
                "id": "3",
                "name": "sample3"
            },
            "geometry": {
                "type": "Polygon",
                "coordinates": [[
                    [139.76617813110352, 35.675949251235025],
                    [139.77188587188718, 35.67410157813001],
                    [139.77227210998535, 35.67455478492641],
                    [139.77862358093262, 35.683757812281115],
                    [139.77343082427979, 35.68431553740134],
                    [139.77094173431396, 35.68469897115985],
                    [139.76871013641357, 35.679923346539084],
                    [139.76617813110352, 35.675949251235025]
                ]]
            }
        }
    ]
}



OpenLayersを手軽に始めるビルド環境公開しています。
openlayers-starter



book

Q&A