八章-92-使用EPSG检索结果重投影

2020-03-27  本文已影响0人  彩云飘过

本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers 5.3.x api。

image.png

源码 见 1092.html ,对应的 官网示例

核心技术点:
使用proj4定义坐标系
使用新的坐标系生成新的view,将新view应用到map上
<!DOCTYPE html>
<html>

<head>
 <title></title>
 <link rel="stylesheet" href="../include/ol.css" type="text/css" />
 <script src="../include/ol.js"></script>
</head>
<style></style>

<body>

 <form class="form-inline">
   <label for="epsg-query">搜索投影坐标系:</label>
   <input type="text" id="epsg-query" placeholder="4326, 27700, US National Atlas, Swiss, France, ..."
     class="form-control" size="50" />
   <button id="epsg-search" class="btn">搜索</button>
   <span id="epsg-result"></span>
   <div>
     <label for="render-edges">
       渲染重投影区域边缘
       <input type="checkbox" id="render-edges">
     </label>
   </div>
 </form>
 <div id="map" class="map"></div>
 <div id="info">&nbsp;</div>
 <script>
   var map = new ol.Map({
     layers: [
       new ol.layer.Tile({
         source: new ol.source.OSM()
       })
     ],
     target: 'map',
     view: new ol.View({
       projection: 'EPSG:3857',
       center: [0, 0],
       zoom: 1
     })
   });


   var queryInput = document.getElementById('epsg-query');
   var searchButton = document.getElementById('epsg-search');
   var resultSpan = document.getElementById('epsg-result');
   var renderEdgesCheckbox = document.getElementById('render-edges');

   function setProjection(code, name, proj4def, bbox) {
     if (code === null || name === null || proj4def === null || bbox === null) {
       resultSpan.innerHTML = 'Nothing usable found, using EPSG:3857...';
       
       map.setView(new ol.View({
         projection: 'EPSG:3857',
         center: [0, 0],
         zoom: 1
       }));
       return;
     }

     resultSpan.innerHTML = '(' + code + ') ' + name;

     var newProjCode = 'EPSG:' + code;
     proj4.defs(newProjCode, proj4def);
     ol.proj.proj4.register(proj4);
     var newProj = ol.proj.get(newProjCode);
     var fromLonLat = ol.proj.getTransform('EPSG:4326', newProj);

     // very approximate calculation of projection extent
     var extent = ol.extent.applyTransform(
       [bbox[1], bbox[2], bbox[3], bbox[0]], fromLonLat);
     newProj.setExtent(extent);
     var newView = new ol.View({
       projection: newProj
     });
     map.setView(newView);
     newView.fit(extent);
   }


   function search(query) {
     resultSpan.innerHTML = 'Searching ...';
     fetch('https://epsg.io/?format=json&q=' + query).then(function (response) {
       return response.json();
     }).then(function (json) {
       var results = json['results'];
       if (results && results.length > 0) {
         for (var i = 0, ii = results.length; i < ii; i++) {
           var result = results[i];
           if (result) {
             var code = result['code'];
             var name = result['name'];
             var proj4def = result['proj4'];
             var bbox = result['bbox'];
             if (code && code.length > 0 && proj4def && proj4def.length > 0 &&
               bbox && bbox.length == 4) {
               setProjection(code, name, proj4def, bbox);
               return;
             }
           }
         }
       }
       setProjection(null, null, null, null);
     });
   }



   searchButton.onclick = function (event) {
     search(queryInput.value);
     event.preventDefault();
   };


   renderEdgesCheckbox.onchange = function () {
     map.getLayers().forEach(function (layer) {
       if (layer instanceof ol.layer.Tile) {
         var source = layer.getSource();
         if (source instanceof ol.source.TileImage) {
           source.setRenderReprojectionEdges(renderEdgesCheckbox.checked);
         }
       }
     });
   };
 </script>
</body>

</html>
上一篇 下一篇

猜你喜欢

热点阅读