<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/layout}">
<head>
<meta charset="UTF-8" th:remove="tag">
<script th:inline="javascript">
const meshes = /*[[${meshes}]]*/"meshes";
console.log(meshes);
const city = /*[[${city}]]*/"city";
console.log(city);
var __map = null;
var __markerLayer = null;
var __lineLayer = null;
function loadMap() {
// ICON のスタイル
style = new ol.style.Style({
image: new ol.style.Icon({
src: '/task-bldg/img/osm_200x200.png',
anchor: [0.5, 0.5],
scale: 0.2
}),
stroke: new ol.style.Stroke({color: '#ff33ff', width: 10})
});
var status1 = new ol.style.Style({
image: new ol.style.Icon({
src: '/task-bldg/img/PREPARATION.png',
anchor: [0.5, 0.5],
scale: 1
})
});
var status2 = new ol.style.Style({
image: new ol.style.Icon({
src: '/task-bldg/img/ACCEPTING.png',
anchor: [0.5, 0.5],
scale: 1
})
});
var status3 = new ol.style.Style({
image: new ol.style.Icon({
src: '/task-bldg/img/RESERVED.png',
anchor: [0.5, 0.5],
scale: 1
})
});
var status4 = new ol.style.Style({
image: new ol.style.Icon({
src: '/task-bldg/img/IMPORTED.png',
anchor: [0.5, 0.5],
scale: 1
})
});
var status5 = new ol.style.Style({
image: new ol.style.Icon({
src: '/task-bldg/img/NG.png',
anchor: [0.5, 0.5],
scale: 1
})
});
var status6 = new ol.style.Style({
image: new ol.style.Icon({
src: '/task-bldg/img/OK.png',
anchor: [0.5, 0.5],
scale: 1
})
});
// マップの作成
__map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
view: new ol.View({
center: ol.proj.fromLonLat([Number(city.lng),Number(city.lat)]),
zoom: 12
})
});
var title = document.getElementById("title");
title.innerHTML = "PLATEAU OSMデータ : " + city.citycode + " " + city.cityname;
// 表示するためのレイヤーを作成する
__markerLayer = new ol.layer.Vector({
source: new ol.source.Vector()
});
__map.addLayer(__markerLayer);
// ポップアップを表示するためのオーバーレイを作成する
__overlay = new ol.Overlay({
element: document.getElementById('popup'),
positioning: 'bottom-center'
});
{
$(meshes).each(function() {
// Icon
var feature = new ol.Feature({
geometry: new ol.geom.Point(ol.proj.fromLonLat([Number(this.lng),Number(this.lat)])),
code: this.meshcode
});
feature.information = this;
if (this.status == "PREPARATION") {
feature.setStyle(status1);
}
else if (this.status == "ACCEPTING") {
feature.setStyle(status2);
}
else if (this.status == "RESERVED") {
feature.setStyle(status3);
}
else if (this.status == "EDITING") {
feature.setStyle(status4);
}
else if (this.status == "NG") {
feature.setStyle(status5);
}
else if (this.status == "OK") {
feature.setStyle(status6);
}
else {
feature.setStyle(style);
}
__markerLayer.getSource().addFeature(feature);
__map.getView().setCenter(ol.proj.fromLonLat([Number(this.lng),Number(this.lat)]));
// LineString
if (this.line != null) {
var lineString = JSON.parse(this.line);
var points = lineString.coordinates;
console.log(points);
drawPolygon([points]);
}
});
// 地図のクリックイベントを設定
__map.on('click', function (evt) {
var feature = __map.forEachFeatureAtPixel(
evt.pixel,
function (feature) {
return feature;
}
);
if (feature) {
var coordinates = feature.getGeometry().getCoordinates();
var info = feature.information;
var element = __overlay.getElement();
var descriptionHTML =
"<div>" + info.citycode +" : "+ info.cityname + "</div>" +
"<div>code: " + info.meshcode + "</div>" +
"<div>file: " + info.path + "</div>" +
"<div>version: " + info.version + "</div>" +
"<div>surveyYear: " + info.surveyYear + "</div>" +
"<div>status: " + info.status + "</div>" +
"<div><a href='/task-bldg/tasks?citycode=" + city.citycode + "&meshcode=" + info.meshcode +"'>タスク</a></div>";
element.innerHTML = descriptionHTML;
__overlay.setPosition(coordinates);
__map.addOverlay(__overlay);
} else {
__map.removeOverlay(__overlay);
}
});
};
}
/**
* ポリゴンを描画する
*/
function drawPolygon(coordinates) {
// ジオメトリの作成
var polygon = new ol.geom.Polygon([]);
polygon.setCoordinates(coordinates);
// 地物オブジェクトの作成 〜 レイヤーの作成
var feature = new ol.Feature(
polygon.transform('EPSG:4326', 'EPSG:3857')
);
feature.setId('tokyotower');
var vector = new ol.source.Vector({
features: [feature]
});
var routeLayer = new ol.layer.Vector({
source: vector,
style: new ol.style.Style({
stroke: new ol.style.Stroke({ color: '#000000', width: 2 })
//fill: new ol.style.Fill({ color: [0, 0, 0, 0.2] })
})
});
// 作成したポリゴンをレイヤーにのせる
__map.addLayer(routeLayer);
}
</script>
</head>
<body onload='loadMap()'>
<input type="hidden" id="city" th:value="${city}" />
<!-- サイドバーの表示 -->
<div layout:fragment="sidebar" th:replace="~{fragments/sidebar :: sidebar}">
</div>
<!-- コンテンツの表示 -->
<div layout:fragment="content">
<main class="offcanvas-outside bg-light">
<div class="container-fluid">
<!-- トグルボタン -->
<div th:replace="~{fragments/sidebar :: toggler}">
</div>
<div class="row">
<div class="col">
<div class="card shadow">
<div class="card-header">
<h6 class="text-navy my-2" id='title'></h6>
</div>
<div class="card-body">
<!-- マップ -->
<div id="wrap">
<div class="header">
<div id='map'></div>
</div>
<!-- ポップアップ -->
<div id='popup' class='ol-popup'>
<a href='#' id='popup-closer' class='ol-popup-closer'></a>
<div id='popup-content'></div>
</div>
</div>
<table class="table table-bordered">
<tbody th:object="${mesh}">
<tr>
<td>
<a th:text="#{return}" th:href="@{/}" class="btn btn-navy">
</a>
</td>
<td>
<img th:src="@{/img/NG.png}"></img>:エラー <img th:src="@{/img/OK.png}"></img>:完了 <img th:src="@{/img/EDITING.png}"></img>:編集中 <img th:src="@{/img/RESERVED.png}"></img>:予約済み <img th:src="@{/img/ACCEPTING.png}"></img>:受付中 <img th:src="@{/img/PREPARATION.png}"></img>:未着手
</td>
</tr>
</tbody>
</table>
<table class="table table-bordered">
<thead>
<tr>
<th th:text="#{status}"></th>
<th th:text="#{meshcode}"></th>
<th>version</th>
<th th:text="#{path}"></th>
<th th:text="#{editor}"></th>
<th th:text="#{operation}"></th>
</tr>
</thead>
<tbody>
<tr th:each="mesh : ${meshes}" th:object="${mesh}">
<td><img th:alt="*{status}" th:src="@{/img/{status}.png(status=*{status})}"></img></td>
<td th:text="*{meshcode}"></td>
<td th:text="*{version}"></td>
<td th:text="*{path}"></td>
<td><a th:text="*{username}" th:href="@{https://www.openstreetmap.org/user/{user}(user=*{username})}"></a></td>
<td>
<a th:text="#{download}" th:href="@{{site}{folder}/bldg/{path}(site=*{city.site},folder=*{city.folder},path=*{path})}" class="btn btn-navy">
</a>
<a th:href="@{/tasks?citycode={city.citycode}&meshcode={meshcode}(city.citycode=*{city.citycode},meshcode=*{meshcode})}" class="btn btn-navy">
<i class="bi bi-pencil-square" th:text="#{operation}"></i>
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</main>
</div>
</body>
</html>