<!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/EDITING.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>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> </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>