<!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 citycode = /*[[${citycode}]]*/"citycode"; const cityname = /*[[${cityname}]]*/"cityname"; const meshcode = /*[[${meshcode}]]*/"meshcode"; const tasks = /*[[${tasks}]]*/"tasks"; const meshstr = /*[[${meshstr}]]*/"meshstr"; var mesh = JSON.parse(meshstr); var __map = null; var __markerLayer = null; var __lineLayer = null; var dir = "./"; var line = []; function loadMap() { // 'citycode'に対応するデータを読む dir = mesh.path + "/bldg/"; var lonlat = [139.7637,35.6808]; // マップの作成 __map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], view: new ol.View({ center: ol.proj.fromLonLat(lonlat), zoom: 15 }) }); // 表示するためのレイヤーを作成する __markerLayer = new ol.layer.Vector({ source: new ol.source.Vector() }); __map.addLayer(__markerLayer); // ポップアップを表示するためのオーバーレイを作成する __overlay = new ol.Overlay({ element: document.getElementById('popup'), positioning: 'bottom-center' }); // ICON のスタイル style = new ol.style.Style({ image: new ol.style.Icon({ src: './img/osm_200x200.png', anchor: [0.5, 0.5], scale: 0.2 }), stroke: new ol.style.Stroke({color: '#ff33ff', width: 10}) }); // マーカーの表示 featurePoint = new ol.Feature({ geometry: new ol.geom.Point(ol.proj.fromLonLat([Number(mesh.lng),Number(mesh.lat)])), code: mesh.meshcode }); featurePoint.information = mesh; featurePoint.setStyle(style); __markerLayer.getSource().addFeature(featurePoint); __map.getView().setCenter(ol.proj.fromLonLat([Number(mesh.lng),Number(mesh.lat)])); var line = JSON.parse(mesh.line); drawPolygon([line.coordinates]); // 地図のクリックイベントを設定 __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>code: " + info.properties.id + "</div>" + "<div>version: " + info.properties.version + "</div>" + "<div><a href='"+ site + dir + info.properties.path +"'>" + info.properties.path + "</a></div>" + "<div><a href='https://www.openstreetmap.org/#map=15/"+ info.properties.lat + "/" + info.properties.lng +"'>OpenStreetMap で現状を確認する</a></div>"; element.innerHTML = descriptionHTML; __overlay.setPosition(coordinates); __map.addOverlay(__overlay); } else { __map.removeOverlay(__overlay); } }); } /** * ポリゴンを描画する ret: routeLayer */ 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(meshcode); var vector = new ol.source.Vector({ features: [feature] }); 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()'> <!-- サイドバーの表示 --> <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">Plateau 3D都市データ</h6> </div> <div class="card-body"> <!-- マップ --> <div id="wrap"> <div class="header"> <div id='title'></div> <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> <th> <div> <i th:text="#{cityname}"></i> : <i th:text="*{citycode}"></i> <i th:text="${cityname}"></i> </div> <div> <i th:text="#{meshcode}"></i> : <i th:text="*{meshcode}"></i> </div> <div> <i th:text="#{status}"></i> : <img th:alt="*{status}" th:src="@{/img/{status}.png(status=*{status})}"></img> <i th:text="*{status}"></i> </div> </th> </tr> <tr> <td> <a th:text="#{return}" th:href="@{/mesh/{citycode}(citycode=*{citycode})}" class="btn btn-navy"> </a> <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="@{/task/add?op=RESERVE&citycode={citycode}&meshcode={meshcode}(citycode=*{citycode},meshcode=*{meshcode})}" th:readonly="*{status} eq 'RESERVED'" class="btn btn-navy"> <i class="bi bi-pencil-square" th:text="#{reserve}" ></i> </a> <a th:href="@{/task/add?op=CANCEL&citycode={citycode}&meshcode={meshcode}(citycode=*{citycode},meshcode=*{meshcode})}" class="btn btn-navy"> <i class="bi bi-pencil-square" th:text="#{cancel}"></i> </a> <a th:href="@{/task/add?op=NG&citycode={citycode}&meshcode={meshcode}(citycode=*{citycode},meshcode=*{meshcode})}" class="btn btn-navy"> <i class="bi bi-pencil-square" th:text="#{NG}"></i> </a> <a th:href="@{/task/add?op=OK&citycode={citycode}&meshcode={meshcode}(citycode=*{citycode},meshcode=*{meshcode})}" class="btn btn-navy"> <i class="bi bi-pencil-square" th:text="#{OK}"></i> </a> </td> </tr> </tbody> </table> <table class="table table-bordered"> <thead> <tr> <th colspan="6">履歴</th> </tr> <tr> <th th:text="#{updateTime}"></th> <th th:text="#{status}"></th> <th th:text="#{editor}"></th> <th th:text="#{changeSet}"></th> <th th:text="#{operation}"></th> <th th:text="#{comment}"></th> </tr> </thead> <tbody> <tr th:each="task : ${tasks}" th:object="${task}"> <td th:text="*{updateTime}"></td> <td><img th:alt="*{status}" th:src="@{/img/{status}.png(status=*{status})}"></img></td> <td><a th:text="*{username}" th:href="@{https://www.openstreetmap.org/user/{user}(user=*{username})}"></a></td> <td th:text="*{changeSet}"></td> <td th:text="*{operation}"></td> <td th:text="*{comment}"></td> </tr> </tbody> </table> </div> </div> </div> </div> </div> </main> </div> </body> </html>