Newer
Older
task-bldg / src / main / resources / templates / meshes.html
@haya4 haya4 on 28 Nov 2023 9 KB v0.1.17 進捗状況の表示
<!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>