WebGISを使えば、ブラウザで地理情報を共有・活用できます。
WebGIS入門【ブラウザで地図を表示する技術】
この記事では、WebGISの基礎知識と構築方法を解説します。
WebGISとは
概要
WebGISは、Webブラウザで動作する地理情報システムです。
【特徴】 ・インストール不要 ・どこからでもアクセス可能 ・データの共有が容易 ・マルチデバイス対応
デスクトップGISとの違い
| 項目 | デスクトップGIS | WebGIS |
|---|---|---|
| 動作環境 | PC | ブラウザ |
| インストール | 必要 | 不要 |
| 機能 | 高機能 | 表示・閲覧中心 |
| 共有 | ファイル共有 | URL共有 |
| コスト | ソフト費用 | 開発費用 |
主な用途
用途
- 地図情報の公開
- 現場データの共有
- 位置情報の可視化
- 業務システムへの組み込み
主要なWebGIS技術
JavaScriptライブラリ
| ライブラリ | 特徴 | 用途 |
|---|---|---|
| Leaflet | 軽量・シンプル | 一般的な地図表示 |
| OpenLayers | 高機能 | 複雑なGIS機能 |
| Mapbox GL JS | 美しい地図 | デザイン重視 |
| Google Maps API | 豊富な機能 | Google連携 |
比較
Leaflet
- 最も軽量
- 学習コストが低い
- プラグインが豊富
- 初心者におすすめ
OpenLayers
- 高機能
- OGC標準対応
- WMS/WFS対応
- 専門的な用途向け
Mapbox GL JS
- ベクタータイル対応
- 美しいデザイン
- 3D表示可能
- 商用利用に制限あり
Leafletによる地図表示
基本構成
html
<!DOCTYPE html>
<html>
<head>
<title>WebGIS Sample</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<style>
#map {
width: 100%;
height: 500px;
}
</style>
</head>
<body>
<div id="map"></div>
<script>
// 地図を初期化
var map = L.map('map').setView([35.6812, 139.7671], 13);
// OpenStreetMapタイルを追加
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
</script>
</body>
</html>
地図の初期設定
javascript
// 地図を作成
var map = L.map('map', {
center: [35.6812, 139.7671], // 中心座標
zoom: 13, // ズームレベル
minZoom: 5, // 最小ズーム
maxZoom: 18 // 最大ズーム
});
ズームコントロール
javascript
// デフォルトのズームコントロールを無効化
var map = L.map('map', {
zoomControl: false
});
// カスタム位置に配置
L.control.zoom({
position: 'bottomright'
}).addTo(map);
地理院タイルの活用
標準地図
javascript
// 地理院タイル(標準地図)
L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', {
attribution: '<a href="https://maps.gsi.go.jp/development/ichiran.html">国土地理院</a>',
maxZoom: 18
}).addTo(map);
航空写真
javascript
// 地理院タイル(航空写真)
L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{z}/{x}/{y}.jpg', {
attribution: '<a href="https://maps.gsi.go.jp/development/ichiran.html">国土地理院</a>',
maxZoom: 18
}).addTo(map);
レイヤー切り替え
javascript
// ベースマップを定義
var baseMaps = {
"標準地図": L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png'),
"航空写真": L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{z}/{x}/{y}.jpg'),
"淡色地図": L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png')
};
// デフォルトのレイヤーを追加
baseMaps["標準地図"].addTo(map);
// レイヤーコントロールを追加
L.control.layers(baseMaps).addTo(map);
マーカーとポップアップ
基本的なマーカー
javascript
// マーカーを追加
var marker = L.marker([35.6812, 139.7671]).addTo(map);
// ポップアップを追加
marker.bindPopup("<b>東京駅</b><br>JR東日本の駅");
カスタムアイコン
javascript
// カスタムアイコンを定義
var customIcon = L.icon({
iconUrl: 'marker-icon.png',
iconSize: [32, 32],
iconAnchor: [16, 32],
popupAnchor: [0, -32]
});
// カスタムアイコンでマーカーを追加
L.marker([35.6812, 139.7671], {icon: customIcon}).addTo(map);
複数マーカー
javascript
// マーカーデータ
var locations = [
{name: "東京駅", lat: 35.6812, lng: 139.7671},
{name: "新宿駅", lat: 35.6896, lng: 139.7006},
{name: "渋谷駅", lat: 35.6580, lng: 139.7016}
];
// マーカーを追加
locations.forEach(function(loc) {
L.marker([loc.lat, loc.lng])
.bindPopup(loc.name)
.addTo(map);
});
マーカークラスタリング
html
<!-- プラグインを読み込み -->
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster/dist/MarkerCluster.css" />
<script src="https://unpkg.com/leaflet.markercluster/dist/leaflet.markercluster.js"></script>
<script>
// クラスターグループを作成
var markers = L.markerClusterGroup();
// マーカーを追加
locations.forEach(function(loc) {
markers.addLayer(L.marker([loc.lat, loc.lng]));
});
// マップに追加
map.addLayer(markers);
</script>
GeoJSONデータの表示
基本的な表示
javascript
// GeoJSONデータ
var geojsonData = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {"name": "ポイント1"},
"geometry": {
"type": "Point",
"coordinates": [139.7671, 35.6812]
}
}
]
};
// 地図に追加
L.geoJSON(geojsonData).addTo(map);
スタイル設定
javascript
// ポリゴンのスタイル
function style(feature) {
return {
fillColor: '#3388ff',
weight: 2,
opacity: 1,
color: 'white',
fillOpacity: 0.7
};
}
// スタイルを適用
L.geoJSON(geojsonData, {style: style}).addTo(map);
ポップアップ
javascript
// 各フィーチャーにポップアップを追加
L.geoJSON(geojsonData, {
onEachFeature: function(feature, layer) {
if (feature.properties && feature.properties.name) {
layer.bindPopup(feature.properties.name);
}
}
}).addTo(map);
外部ファイルの読み込み
javascript
// fetchでGeoJSONを読み込み
fetch('data.geojson')
.then(response => response.json())
.then(data => {
L.geoJSON(data, {
onEachFeature: function(feature, layer) {
layer.bindPopup(feature.properties.name);
}
}).addTo(map);
});
実践的な活用例
現場位置マップ
html
<!DOCTYPE html>
<html>
<head>
<title>現場位置マップ</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<style>
body { margin: 0; padding: 0; }
#map { width: 100%; height: 100vh; }
.site-popup { min-width: 200px; }
.site-popup h3 { margin: 0 0 10px 0; }
</style>
</head>
<body>
<div id="map"></div>
<script>
var map = L.map('map').setView([35.6812, 139.7671], 12);
L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', {
attribution: '国土地理院'
}).addTo(map);
// 現場データ
var sites = [
{
name: "A工事現場",
lat: 35.69, lng: 139.75,
status: "進行中",
manager: "山田"
},
{
name: "B工事現場",
lat: 35.67, lng: 139.78,
status: "完了",
manager: "佐藤"
}
];
// マーカーを追加
sites.forEach(function(site) {
var popupContent = `
<div class="site-popup">
<h3>${site.name}</h3>
<p>状態: ${site.status}</p>
<p>担当: ${site.manager}</p>
</div>
`;
L.marker([site.lat, site.lng])
.bindPopup(popupContent)
.addTo(map);
});
</script>
</body>
</html>
施設検索機能
javascript
// 検索機能
function searchSite(keyword) {
var results = sites.filter(function(site) {
return site.name.includes(keyword);
});
if (results.length > 0) {
var site = results[0];
map.setView([site.lat, site.lng], 15);
}
}
// 検索ボタン
document.getElementById('searchBtn').addEventListener('click', function() {
var keyword = document.getElementById('searchInput').value;
searchSite(keyword);
});
まとめ
WebGISの特徴
特徴
- ブラウザで動作
- インストール不要
- 情報共有が容易
- マルチデバイス対応
導入ステップ
4ステップ
- Leafletを読み込み
- 地図コンテナを作成
- タイルレイヤーを追加
- マーカー等を追加
活用シーン
活用例
- 現場位置の共有
- 施設マップの公開
- データの可視化
- 業務システム連携
関連記事
