jgis 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,6 +22,12 @@
22
22
  * **Unified Styling**:WMS 图层也能像 Vector 一样拥有动态高亮样式。
23
23
  * **🎨 灵活的样式系统**:
24
24
  * 支持根据图层、属性动态渲染高亮样式,完全控制权交给用户。
25
+ * **🗺️ 二三维API风格一致**:
26
+ * 二三维API风格一致,方便会一种框架的开发者快速理解和上手开发。
27
+ * **🗺️ 完全兼容openlayers/cesium**:
28
+ * 导出`instance`地图实例,可自己操作原生API。
29
+ * 如果有特殊需求,完全可以自己用原生实现,没有任何违和感。
30
+
25
31
 
26
32
  ---
27
33
 
@@ -38,6 +44,7 @@ npm install ol
38
44
  npm install cesium
39
45
  ```
40
46
 
47
+
41
48
  ---
42
49
 
43
50
  ## 🗺️ 快速开始 (2D)
@@ -53,15 +60,26 @@ npm install cesium
53
60
  <script setup>
54
61
  import { onMounted } from 'vue';
55
62
  import 'ol/ol.css'; // ⚠️ 别忘了引入 OpenLayers 样式
56
- import { createMap2D } from 'jgis/2d';
63
+ import { useMap } from 'jgis/2d';
57
64
 
58
65
  onMounted(() => {
59
66
  // 初始化地图,会自动注册为全局激活实例
60
- createMap2D({
61
- target: 'map-container',
67
+ const { instance, addMarker, createLayer } = useMap('map-container', {
62
68
  center: [116.4, 39.9],
63
69
  zoom: 10
64
70
  });
71
+
72
+ addMarker('创建点位图层', [{ lon: 104.064839, lat: 30.548857 }], {
73
+ style: new Style({
74
+ image: new CircleStyle({
75
+ radius: 5,
76
+ fill: new Fill({ color: 'blue' })
77
+ })
78
+ })
79
+ })
80
+
81
+ createLayer('创建wms服务图层', { url: 'https://ahocevar.com/geoserver/wms', type: 'Wms', layers: 'topp:states' })
82
+
65
83
  });
66
84
  </script>
67
85
  ```
@@ -71,15 +89,14 @@ onMounted(() => {
71
89
  JGIS 的核心优势在于**同时处理 Vector 和 WMS 图层**,并提供统一的样式回调。
72
90
 
73
91
  ```javascript
74
- import { useSelect } from 'jgis/2d';
75
- import { Style, Stroke, Fill } from 'ol/style'; // 或从 jgis 导出
92
+ const { createSelect, createHover } = useMap('map-container');
76
93
 
77
94
  // 假设你有两个图层:一个是本地 Vector,一个是 Geoserver WMS
78
95
  const vectorLayer = ...;
79
96
  const wmsLayer = ...;
80
97
 
81
98
  // 开启选择交互 (无需传入 map 实例)
82
- const select = useSelect({
99
+ const select = createSelect({
83
100
  // 监听这些图层 (不传则监听所有)
84
101
  layers: [vectorLayer, wmsLayer],
85
102
 
@@ -87,14 +104,14 @@ const select = useSelect({
87
104
  multi: false,
88
105
 
89
106
  // 自定义高亮样式 (支持函数或对象)
90
- style: (feature) => {
107
+ style: (layerName, feature) => {
91
108
  // 自动识别数据来源
92
- const layer = feature.get('_origin_layer'); // WMS 注入的标记
109
+ const layer = feature.get('wms_layer_source'); // WMS 注入的标记
93
110
  const type = feature.get('type');
94
111
 
95
112
  // 根据业务逻辑返回不同样式
96
113
  if (layer === wmsLayer) {
97
- return new Style({
114
+ return new Style({
98
115
  stroke: new Stroke({ color: 'red', width: 3 }),
99
116
  fill: new Fill({ color: 'rgba(255,0,0,0.1)' })
100
117
  });
@@ -116,30 +133,159 @@ select.onSelect((res) => {
116
133
  }
117
134
  });
118
135
 
136
+
137
+ // 监听回调
138
+ select.onSelect((res) => {
139
+ if (res && res.length > 0) {
140
+ // res 是一个数组,包含 feature, layer 和 properties
141
+ const item = res[0];
142
+ console.log('选中要素属性:', item.properties);
143
+ console.log('所属图层:', item.layer);
144
+ } else {
145
+ console.log('取消选中');
146
+ }
147
+ });
148
+
149
+ const { onHover } = createHover({
150
+ style: new Style({
151
+ stroke: new Stroke({ color: 'blue', width: 3 }),
152
+ fill: new Fill({ color: 'rgba(0,0,255,0.1)' })
153
+ })
154
+ })
155
+
156
+ onHover(data => {
157
+ console.log('鼠标悬浮获取的数据:', data);
158
+ })
159
+
160
+
161
+
119
162
  // 页面销毁时可调用
120
163
  // select.destroy();
121
164
  ```
122
165
 
166
+
167
+ ### 3. 异步调用
168
+
169
+ 如果创建地图的`useMap`在一个文件,而选择交互在另一个文件,可以使用异步调用。在文件中使用`onMapReady`和`getMapContext`方法来获取地图方法,而不需要传递跟地图相关的任何参数,但是必须指定地图容器的 id。例如:
170
+
171
+ ```js
172
+ import { onMapReady, getMapContext } from 'jgis/2d';
173
+
174
+ // 'map-container' 是地图容器的 id
175
+ onMapReady('map-container', ({ createLayer, flyTo }) => {
176
+
177
+ })
178
+
179
+
180
+ getMapContext('map-container').then(({ createLayer, flyTo }) => {
181
+
182
+ })
183
+
184
+ ```
185
+
186
+
123
187
  ---
124
188
 
125
189
  ## 🌍 快速开始 (3D)
126
190
 
127
191
  三维模块完全隔离,不会污染二维项目。
128
192
 
129
- ```javascript
130
- import { createMap3D, flyTo } from 'jgis/3d';
193
+ ### 1. 初始化地图
194
+
195
+ ```vue
196
+ <template>
197
+ <!-- ⚠️ 注意:必须给容器设置高度,否则地图无法显示 -->
198
+ <div id="map-container" style="height: 100vh; width: 100%;"></div>
199
+ </template>
200
+
201
+ <script setup>
202
+ import { onMounted } from 'vue';
203
+ import { useMap } from 'jgis/3d';
204
+
205
+ onMounted(() => {
206
+ // 初始化地图,会自动注册为全局激活实例
207
+ const { instance, flyTo, addMarker } = useMap('map-container', {
208
+ center: [116.4, 39.9],
209
+ zoom: 10
210
+ });
211
+
212
+ addMarker(
213
+ '创建点位图层',
214
+ [
215
+ { lon: 104.397428, lat: 30.90923 },
216
+ { lon: 104.45343, lat: 30.83233 }
217
+ ],
218
+ {
219
+ getImage: (item) => new URL('./img.png', import.meta.url).href,
220
+ scale: 0.4,
221
+ // color: Cesium.Color.YELLOW,
222
+ disableDepthTestDistance: Number.POSITIVE_INFINITY,
223
+ scaleByDistance: new Cesium.NearFarScalar(1, 1, 100000, 0.2)
224
+ }
225
+ )
131
226
 
132
- // 初始化
133
- const viewer = createMap3D('cesium-container');
227
+ flyTo([104.397428, 30.90923, 10000], { duration: 1, pitch: -Math.PI / 2 })
134
228
 
135
- // 使用工具函数
136
- flyTo(viewer, {
137
- lng: 116.4,
138
- lat: 39.9,
139
- height: 2000
140
229
  });
230
+ </script>
231
+ ```
232
+
233
+ ### 2. 使用交互功能 (Select / Hover)
234
+
235
+
236
+ ```javascript
237
+ import { useMap } from 'jgis/3d';
238
+ const { createSelect, createHover } = useMap('map-container');
239
+
240
+ // click事件
241
+ const { onSelect } = createSelect({
242
+ style: {
243
+ color: Cesium.Color.YELLOW,
244
+ scale: 0.5
245
+ }
246
+ })
247
+
248
+ onSelect((data) => {
249
+ console.log('onSelect获取的数据', data)
250
+ })
251
+
252
+
253
+ // hover事件
254
+ const { onHover } = createHover({
255
+ style: {
256
+ color: Cesium.Color.YELLOW,
257
+ scale: 0.5
258
+ }
259
+ })
260
+
261
+ onHover((data) => {
262
+ console.log('onHover获取的数据', data)
263
+ })
264
+
265
+ ```
266
+
267
+
268
+
269
+ ### 3. 异步调用
270
+
271
+ 如果创建地图的`useMap`在一个文件,而选择交互在另一个文件,可以使用异步调用。在文件中使用`onMapReady`和`getMapContext`方法来获取地图方法,而不需要传递跟地图相关的任何参数,但是必须指定地图容器的 id。例如:
272
+
273
+ ```js
274
+ import { onMapReady, getMapContext } from 'jgis/3d';
275
+
276
+ // 'map-container' 是地图容器的 id
277
+ onMapReady('map-container', ({ createLayer, flyTo }) => {
278
+
279
+ })
280
+
281
+
282
+ getMapContext('map-container').then(({ createLayer, flyTo }) => {
283
+
284
+ })
285
+
141
286
  ```
142
287
 
288
+
143
289
  ---
144
290
 
145
291
  ## 🛠️ 项目配置指南 (Vite & TS)
@@ -1,7 +1,7 @@
1
1
  import { mapConfigOptions, MapContext } from './types';
2
2
  /**
3
3
  * 创建地图
4
- * @param el 地图元素Id
4
+ * @param el 绑定地图元素Id
5
5
  * @param config 配置
6
6
  * @returns 地图方法和地图实例
7
7
  */
package/dist/2d/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var oe=Object.defineProperty,se=Object.defineProperties;var ae=Object.getOwnPropertyDescriptors;var V=Object.getOwnPropertySymbols;var ce=Object.prototype.hasOwnProperty,ie=Object.prototype.propertyIsEnumerable;var C=(e,t,r)=>t in e?oe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,N=(e,t)=>{for(var r in t||(t={}))ce.call(t,r)&&C(e,r,t[r]);if(V)for(var r of V(t))ie.call(t,r)&&C(e,r,t[r]);return e},p=(e,t)=>se(e,ae(t));var I=(e,t,r)=>new Promise((o,n)=>{var s=i=>{try{c(r.next(i))}catch(l){n(l)}},a=i=>{try{c(r.throw(i))}catch(l){n(l)}},c=i=>i.done?o(i.value):Promise.resolve(i.value).then(s,a);c((r=r.apply(e,t)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("ol"),L=require("ol/layer"),w=require("ol/source"),A=require("ol/format"),le=require("ol/Overlay"),T=require("ol/geom"),ue=require("ol/Feature");require("ol/extent");const j=require("ol/style"),ye=require("ol/events/condition.js"),fe=require("ol/interaction/Select");var g=63710088e-1,ge={centimeters:g*100,centimetres:g*100,degrees:360/(2*Math.PI),feet:g*3.28084,inches:g*39.37,kilometers:g/1e3,kilometres:g/1e3,meters:g,metres:g,miles:g/1609.344,millimeters:g*1e3,millimetres:g*1e3,nauticalmiles:g/1852,radians:1,yards:g*1.0936};function D(e,t,r={}){const o={type:"Feature"};return(r.id===0||r.id)&&(o.id=r.id),r.bbox&&(o.bbox=r.bbox),o.properties=t||{},o.geometry=e,o}function B(e,t,r={}){if(!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!W(e[0])||!W(e[1]))throw new Error("coordinates must contain numbers");return D({type:"Point",coordinates:e},t,r)}function de(e,t,r={}){for(const n of e){if(n.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(n[n.length-1].length!==n[0].length)throw new Error("First and last Position are not equivalent.");for(let s=0;s<n[n.length-1].length;s++)if(n[n.length-1][s]!==n[0][s])throw new Error("First and last Position are not equivalent.")}return D({type:"Polygon",coordinates:e},t,r)}function me(e,t="kilometers"){const r=ge[t];if(!r)throw new Error(t+" units is invalid");return e/r}function G(e){return e%(2*Math.PI)*180/Math.PI}function z(e){return e%360*Math.PI/180}function W(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function we(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return[...e.geometry.coordinates];if(e.type==="Point")return[...e.coordinates]}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return[...e];throw new Error("coord must be GeoJSON Point or an Array of numbers")}function he(e,t,r,o={}){const n=we(e),s=z(n[0]),a=z(n[1]),c=z(r),i=me(t,o.units),l=Math.asin(Math.sin(a)*Math.cos(i)+Math.cos(a)*Math.sin(i)*Math.cos(c)),d=s+Math.atan2(Math.sin(c)*Math.sin(i)*Math.cos(a),Math.cos(i)-Math.sin(a)*Math.sin(l)),P=G(d),u=G(l);return n[2]!==void 0?B([P,u,n[2]],o.properties):B([P,u],o.properties)}function be(e,t,r={}){const o=r.steps||64,n=r.properties?r.properties:!Array.isArray(e)&&e.type==="Feature"&&e.properties?e.properties:{},s=[];for(let a=0;a<o;a++)s.push(he(e,t,a*-360/o,r).geometry.coordinates);return s.push(s[0]),de([s],n)}function k(e){return e.lttd&&e.lgtd?[Number(e.lgtd),Number(e.lttd)]:e.jd&&e.wd?[Number(e.jd),Number(e.wd)]:e.latitude&&e.longitude?[Number(e.longitude),Number(e.latitude)]:e.lon&&e.lat?[Number(e.lon),Number(e.lat)]:[0,0]}function J(e,t){e.getLayers().getArray().forEach(o=>{o.get("name")==t&&("setSource"in o&&o.setSource(null),"dispose"in o&&o.dispose(),e.removeLayer(o))})}function U(e,t,r,o=!1){const n=o?r.style||r.getStyle(e,t):void 0,s=o?999:-1;n&&typeof n.setZIndex=="function"&&n.setZIndex(s),t.setStyle(n)}function Se(e,t,r){if(!t)return;const o=r.time||300;let n=Date.now(),s=!1,a=0;t.running=!0;function c(){if(!t.running)return;const i=Date.now();i-n>=o&&(s=!s,n=i,U(e,t,r,s),t.changed()),a=requestAnimationFrame(c)}c(),t.clearFlash=()=>{t.running=!1,cancelAnimationFrame(a),t.setStyle(void 0)}}function Le(e,t,r){var a,c;if(!r)return;let o=k(r);const n=(c=(a=H(e,t))==null?void 0:a.getFeatures)==null?void 0:c.call(a);return n?n.find(function(i){const l=i.getGeometry();return l&&l instanceof T.Geometry&&typeof l.intersectsCoordinate=="function"?l.intersectsCoordinate(o):!1}):void 0}function Fe(e,t,r){const o=[];let n;const s=r.type||"Point";t.forEach(c=>{switch(s){case"Point":n=xe(c);break;case"LineString":n=Pe(c);break;case"MultiLineString":n=ve(c);break;case"MultiPolygon":n=Ee(c);break;case"Polygon":n=Te(c);break}if(!n)return;const i=new ue({geometry:n,data:c});i.set("layerName",e),o.push(i)});const a=new w.Vector;return o.length>0&&a.addFeatures(o),a}function Me(e,t){return t.cqlFilter&&(t.cqlFilter?t.CQL_FILTER+=` and ${t.cqlFilter}`:t.CQL_FILTER=t.cqlFilter),new w.TileWMS({url:t.url,params:{LAYERS:t.layers,CQL_FILTER:t.CQL_FILTER},serverType:"geoserver",crossOrigin:"anonymous"})}function H(e,t){const r=Z(e,t);return r==null?void 0:r.getSource()}function xe(e){const t=k(e);if(t)return new T.Point(t)}function Pe(e){return new T.LineString(e.coordinates)}function ve(e){return new T.MultiLineString(e.coordinates)}function Ee(e){return new T.MultiPolygon(e.coordinates)}function Te(e){return new T.Polygon(e.coordinates)}function O(e,t){let r=null;return t.style?r=t.style:t.getStyle?r=(o,n)=>t.getStyle(e,o,n):r=Ie(),r}function Ie(){return(t,r)=>new j.Style({image:new j.Circle({radius:5,fill:new j.Fill({color:"red"})})})}function Ae(e,t={}){const r=t.token||"dadcbbdb5206b626a29ca739686b3087",o=t.baseType||"img",n=t.noteType||"cia",s=new L.Tile({className:"tdt-base-layer",source:new w.XYZ({url:`http://t0.tianditu.com/DataServer?T=${o}_w&x={x}&y={y}&l={z}&tk=${r}`,maxZoom:t.maxZoom||18,minZoom:t.minZoom||2}),zIndex:t.zIndex||1});s.set("name","tdt-base-layer");const a=new L.Tile({className:"tdt-base-layer",source:new w.XYZ({url:`http://t0.tianditu.com/DataServer?T=${n}_w&x={x}&y={y}&l={z}&tk=${r}`,maxZoom:t.maxZoom||18,minZoom:t.minZoom||2}),zIndex:t.zIndex?t.zIndex+1:2});return a.set("name","tdt-baseNote-layer"),e.addLayer(s),e.addLayer(a),s}function Q(e,t,r,o){(!o||!o.type)&&(o=Object.assign({},r,o));const n=o.type||"Point";let s;switch(n){case"GeoJSON":s=Oe(t,r,e,o);break;case"Wms":s=Re(t,e,o);break;case"Point":case"LineString":case"MultiLineString":case"Polygon":case"MultiPolygon":s=Ne(t,r,e,o);break;case"Circle":s=pe(t,r,e,o);break;case"Overlay":s=je(t,e,o);break}return s}function ke(e,t){Array.isArray(t)?t.forEach(r=>{J(e,r)}):J(e,t)}function Oe(e,t,r,o){console.log(typeof t,t);const n=new A.GeoJSON().readFeatures(t,{dataProjection:"EPSG:4326",featureProjection:"EPSG:4326"}),s=new w.Vector;s.addFeatures(n);const a=new L.Vector({source:s,style:O(e,o),zIndex:o.zIndex||10});return a.set("name",e),a.set("type","webgl"),r.addLayer(a),a}function Re(e,t,r){const o=new L.Tile({opacity:r.opacity||1,source:Me(e,r),zIndex:r.zIndex||10});return o.set("name",e),t.addLayer(o),o}function Ne(e,t,r,o){if(!t||t.length===0)return null;const n=new L.Vector({source:Fe(e,t,o),style:O(e,o),zIndex:o.zIndex||10});return n.set("name",e),n.set("type","webgl"),r.addLayer(n),n}function pe(e,t,r,o){const n=k(t),s=be(n,o.radius,{steps:300,units:"meters"}),a=new A.GeoJSON().readFeature(s,{dataProjection:"EPSG:4326",featureProjection:"EPSG:4490"}),c=new w.Vector({wrapX:!1});c.addFeature(a);const i=new L.Vector({source:c,style:O(e,o),zIndex:o.zIndex?o.zIndex:10});return i.set("name",e),i.set("type","webgl"),r.addLayer(i),i}function je(e,t,r){const o=document.createElement("div"),n=new le({element:o,stopEvent:!1,positioning:r.positioning||"bottom-center"});return n.set("name",e),n.set("type","webgl"),t.addOverlay(n),{overlayer:n,content:o}}function ze(e,t,r){const o=new L.Vector({source:new w.Vector({wrapX:!1}),zIndex:r.zIndex?r.zIndex:10,style:O(t,r)});return o.set("name",t),o.set("type","webgl"),e.addLayer(o),o}function Z(e,t){return e.getAllLayers().find(n=>n.get("name")===t)}function Ze(e,t,r){const o=Z(e,t);return o.setVisible(r),o}const E=new Map,x={},v={},_e=(e,t)=>{E.has(e)&&console.warn(`Map with target '${e}' already exists. Overwriting...`),E.set(e,t),x[e]&&(x[e].forEach(r=>r(t)),delete x[e]),v[e]&&(v[e].forEach(r=>r(t)),delete v[e])};function X(e){const t=E.get(e);return t?Promise.resolve(t):(console.warn(`Map '${e}' not found. Make sure useMap() is called first.`),new Promise(r=>{v[e]=v[e]||[],v[e].push(r)}))}const qe=e=>{E.has(e)&&(E.delete(e),delete x[e])},Y=(e,t)=>{const r=E.get(e);if(r){t(r);return}x[e]||(x[e]=[]),x[e].push(t)};function Ve(e,t={}){if(!e&&!e.target)throw new Error("请传入地图容器");arguments.length===1&&typeof e=="object"&&(t=e,e=t.target);const o=Object.assign({zoom:10,center:[104.064839,30.548857],minZoom:2,maxZoom:19,projection:"EPSG:4326"},t),n=new $.Map({target:e,layers:[],view:new $.View({projection:o.projection,center:o.center,zoom:o.zoom,minZoom:o.minZoom,maxZoom:o.maxZoom})});return n.targetId=e,n}function Ce(e,t,r,o){Q(e,t,r,p(N({},o),{type:"Point"}))}function K(e,t,r){return new Promise((o,n)=>{e.getView().animate({center:t,duration:r.duration||1e3,zoom:r.zoom||te(e),rotation:r.rotation||0,easing:r.easing},o)})}function ee(e,t){const r=(t.extend[0]+t.extend[2])/2,o=(t.extend[1]+t.extend[3])/2;return K(e,[r,o],t)}function $e(e,t,r){const o=t.getGeometry().getExtent();return ee(e,p(N({},r),{extend:o}))}function Be(e){return e.getView().getProjection()}function te(e){return e.getView().getZoom()}function Ge(e,t){e.getView().setZoom(t)}function We(e,t){e.un("click",()=>{}),e.un("pointermove",()=>{}),qe(t)}let M=null;function Je(e,t={}){const r=new A.GeoJSON;M=new fe({condition:ye.click,multi:t.multi||!1,style:c=>{if(typeof t.getStyle=="function"){const i=c.get("layerName");return t.getStyle(i,c)}else return t.style},layers:t.layers?c=>t.layers.includes(c):void 0}),e.addInteraction(M);const o=M.getFeatures(),n=c=>I(null,null,function*(){const i=(t.layers||e.getLayers().getArray()).filter(h=>{const b=h.getSource();return h.getVisible()&&(b instanceof w.TileWMS||b instanceof w.ImageWMS)});if(i.length===0)return;const l=e.getView(),d=i.map(h=>I(null,null,function*(){const y=h.getSource().getFeatureInfoUrl(c.coordinate,l.getResolution(),l.getProjection(),{INFO_FORMAT:"application/json",FEATURE_COUNT:1});if(y)try{const S=yield(yield fetch(y)).json();if(S.features&&S.features.length>0){const m=r.readFeatures(S);return m.forEach(f=>{f.set("wms_layer_source",h),f.set("wms_event_source",c),f.set("layerName",h.get("name"))}),m}}catch(F){console.warn(F)}return[]})),u=(yield Promise.all(d)).flat();u.length>0&&(t.multi,o.extend(u),M.dispatchEvent({type:"select",selected:u,deselected:[],mapBrowserEvent:c}))});e.on("singleclick",n);const s=new Set;M.on("select",c=>{const i=o.getArray();if(i.length>0){const l=i.map(d=>({feature:d,properties:d.getProperties(),layer:d.get("wms_layer_source")||M.getLayer(d),event:d.get("wms_event_source")||c}));a(l)}else a(null)});const a=c=>s.forEach(i=>i(c));return{onSelect:c=>(s.add(c),()=>s.delete(c)),clear:()=>{s.clear(),o.clear()},destroy:()=>{e.removeInteraction(M),e.un("singleclick",n),s.clear()}}}function De(e,t={}){var P;const r=new A.GeoJSON,o=(P=t.debounceTime)!=null?P:200,n=new w.Vector,s=new L.Vector({source:n,map:e,style:t.style,zIndex:1e4,properties:{title:"JG_HOVER_LAYER"}});let a=null,c=null;const i=new Set,l=(u,h,b)=>{const y=u[0];if(a!==y)if(a=y,n.clear(),y?(n.addFeature(y),t.cursor!==!1&&(e.getTargetElement().style.cursor="pointer")):t.cursor!==!1&&(e.getTargetElement().style.cursor=""),y){const F={feature:y,layer:h,properties:y.getProperties(),coordinate:b};i.forEach(S=>S([F]))}else i.forEach(F=>F(null))},d=u=>{if(u.dragging)return;const h=u.pixel,b=u.coordinate;let y=!1;if(e.forEachFeatureAtPixel(h,(m,f)=>{y||f!==s&&(t.layers&&!t.layers.includes(f)||(y=!0,c&&clearTimeout(c),l([m],f,b)))}),y)return;a&&(a=null,n.clear(),e.getTargetElement().style.cursor="",i.forEach(m=>m(null))),c&&clearTimeout(c);const S=(t.layers||e.getLayers().getArray()).filter(m=>{const f=m.getSource();return m.getVisible()&&(f instanceof w.TileWMS||f instanceof w.ImageWMS)});S.length!==0&&(c=setTimeout(()=>I(null,null,function*(){const m=e.getView();for(const f of S){const _=f.getSource().getFeatureInfoUrl(b,m.getResolution(),m.getProjection(),{INFO_FORMAT:"application/json",FEATURE_COUNT:1});if(_)try{const R=yield(yield fetch(_)).json();if(R.features&&R.features.length>0){const q=r.readFeatures(R);q.forEach(ne=>ne.set("wms_layer_source",f)),l(q,f,b);return}}catch(re){}}}),o))};return e.on("pointermove",d),{onHover:u=>(i.add(u),()=>i.delete(u)),clear:()=>{n.clear(),a=null},destroy:()=>{e.un("pointermove",d),e.removeLayer(s),i.clear(),c&&clearTimeout(c)}}}const Ue=(e,t)=>{const r=Ve(e,t);Ae(r,t.baseLayers);const o={targetId:e,instance:r,addMarker:(n,s,a)=>Ce(r,n,s,a),createLayer:(n,s,a)=>Q(r,n,s,a),createBlankLayer:(n,s)=>ze(r,n,s),visibleLayer:(n,s)=>Ze(r,n,s),removeLayer:n=>ke(r,n),getLonLat:n=>k(n),getLayerByName:n=>Z(r,n),getSourceByName:n=>H(r,n),useSelect:n=>Je(r,n),useHover:n=>De(r,n),queryFeature:(n,s)=>Le(r,n,s),lightFeature:(n,s,a,c)=>U(n,s,a,c),flashFeature:(n,s,a)=>Se(n,s,a),flyTo:(n,s)=>K(r,n,s),flyToByExtent:n=>ee(r,n),flyToByFeature:(n,s)=>$e(r,n,s),getProjection:()=>Be(r),getZoom:()=>te(r),setZoom:n=>Ge(r,n),getMapContext:n=>X(n),onMapReady:(n,s)=>Y(n,s),destroyMap:()=>We(r,e)};return _e(e,o),o};function He(e,t){Y(e,t)}function Qe(e){return X(e)}exports.getMapContext=Qe;exports.onMapReady=He;exports.useMap=Ue;
1
+ "use strict";var oe=Object.defineProperty,se=Object.defineProperties;var ae=Object.getOwnPropertyDescriptors;var V=Object.getOwnPropertySymbols;var ce=Object.prototype.hasOwnProperty,ie=Object.prototype.propertyIsEnumerable;var C=(e,t,r)=>t in e?oe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,N=(e,t)=>{for(var r in t||(t={}))ce.call(t,r)&&C(e,r,t[r]);if(V)for(var r of V(t))ie.call(t,r)&&C(e,r,t[r]);return e},j=(e,t)=>se(e,ae(t));var I=(e,t,r)=>new Promise((o,n)=>{var s=i=>{try{c(r.next(i))}catch(l){n(l)}},a=i=>{try{c(r.throw(i))}catch(l){n(l)}},c=i=>i.done?o(i.value):Promise.resolve(i.value).then(s,a);c((r=r.apply(e,t)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("ol"),L=require("ol/layer"),w=require("ol/source"),A=require("ol/format"),le=require("ol/Overlay"),T=require("ol/geom"),ue=require("ol/Feature");require("ol/extent");const p=require("ol/style"),fe=require("ol/control"),ye=require("ol/events/condition.js"),ge=require("ol/interaction/Select");var g=63710088e-1,de={centimeters:g*100,centimetres:g*100,degrees:360/(2*Math.PI),feet:g*3.28084,inches:g*39.37,kilometers:g/1e3,kilometres:g/1e3,meters:g,metres:g,miles:g/1609.344,millimeters:g*1e3,millimetres:g*1e3,nauticalmiles:g/1852,radians:1,yards:g*1.0936};function D(e,t,r={}){const o={type:"Feature"};return(r.id===0||r.id)&&(o.id=r.id),r.bbox&&(o.bbox=r.bbox),o.properties=t||{},o.geometry=e,o}function B(e,t,r={}){if(!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!W(e[0])||!W(e[1]))throw new Error("coordinates must contain numbers");return D({type:"Point",coordinates:e},t,r)}function me(e,t,r={}){for(const n of e){if(n.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(n[n.length-1].length!==n[0].length)throw new Error("First and last Position are not equivalent.");for(let s=0;s<n[n.length-1].length;s++)if(n[n.length-1][s]!==n[0][s])throw new Error("First and last Position are not equivalent.")}return D({type:"Polygon",coordinates:e},t,r)}function we(e,t="kilometers"){const r=de[t];if(!r)throw new Error(t+" units is invalid");return e/r}function G(e){return e%(2*Math.PI)*180/Math.PI}function z(e){return e%360*Math.PI/180}function W(e){return!isNaN(e)&&e!==null&&!Array.isArray(e)}function he(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if(e.type==="Feature"&&e.geometry!==null&&e.geometry.type==="Point")return[...e.geometry.coordinates];if(e.type==="Point")return[...e.coordinates]}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return[...e];throw new Error("coord must be GeoJSON Point or an Array of numbers")}function be(e,t,r,o={}){const n=he(e),s=z(n[0]),a=z(n[1]),c=z(r),i=we(t,o.units),l=Math.asin(Math.sin(a)*Math.cos(i)+Math.cos(a)*Math.sin(i)*Math.cos(c)),d=s+Math.atan2(Math.sin(c)*Math.sin(i)*Math.cos(a),Math.cos(i)-Math.sin(a)*Math.sin(l)),P=G(d),u=G(l);return n[2]!==void 0?B([P,u,n[2]],o.properties):B([P,u],o.properties)}function Se(e,t,r={}){const o=r.steps||64,n=r.properties?r.properties:!Array.isArray(e)&&e.type==="Feature"&&e.properties?e.properties:{},s=[];for(let a=0;a<o;a++)s.push(be(e,t,a*-360/o,r).geometry.coordinates);return s.push(s[0]),me([s],n)}function k(e,t){return typeof e!="object"||e===null?null:e.lttd&&e.lgtd?[Number(e.lgtd),Number(e.lttd)]:e.jd&&e.wd?[Number(e.jd),Number(e.wd)]:e.latitude&&e.longitude?[Number(e.longitude),Number(e.latitude)]:e.lon&&e.lat?[Number(e.lon),Number(e.lat)]:null}function J(e,t){e.getLayers().getArray().forEach(o=>{o.get("name")==t&&("setSource"in o&&o.setSource(null),"dispose"in o&&o.dispose(),e.removeLayer(o))})}function U(e,t,r,o=!1){const n=o?r.style||r.getStyle(e,t):void 0,s=o?999:-1;n&&typeof n.setZIndex=="function"&&n.setZIndex(s),t.setStyle(n)}function Le(e,t,r){if(!t)return;const o=r.time||300;let n=Date.now(),s=!1,a=0;t.running=!0;function c(){if(!t.running)return;const i=Date.now();i-n>=o&&(s=!s,n=i,U(e,t,r,s),t.changed()),a=requestAnimationFrame(c)}c(),t.clearFlash=()=>{t.running=!1,cancelAnimationFrame(a),t.setStyle(void 0)}}function Fe(e,t,r){var a,c;if(!r)return;let o=k(r);const n=(c=(a=H(e,t))==null?void 0:a.getFeatures)==null?void 0:c.call(a);return n?n.find(function(i){const l=i.getGeometry();return l&&l instanceof T.Geometry&&typeof l.intersectsCoordinate=="function"?l.intersectsCoordinate(o):!1}):void 0}function Me(e,t,r){const o=[];let n;const s=r.type||"Point";t.forEach(c=>{switch(s){case"Point":n=Pe(c);break;case"LineString":n=ve(c);break;case"MultiLineString":n=Ee(c);break;case"MultiPolygon":n=Te(c);break;case"Polygon":n=Ie(c);break}if(!n)return;const i=new ue({geometry:n,data:c});i.set("layerName",e),o.push(i)});const a=new w.Vector;return o.length>0&&a.addFeatures(o),a}function xe(e,t){return t.cqlFilter&&(t.cqlFilter?t.CQL_FILTER+=` and ${t.cqlFilter}`:t.CQL_FILTER=t.cqlFilter),new w.TileWMS({url:t.url,params:{LAYERS:t.layers,CQL_FILTER:t.CQL_FILTER},serverType:"geoserver",crossOrigin:"anonymous"})}function H(e,t){const r=Z(e,t);return r==null?void 0:r.getSource()}function Pe(e){const t=k(e);if(t)return new T.Point(t)}function ve(e){return new T.LineString(e.coordinates)}function Ee(e){return new T.MultiLineString(e.coordinates)}function Te(e){return new T.MultiPolygon(e.coordinates)}function Ie(e){return new T.Polygon(e.coordinates)}function O(e,t){let r=null;return t.style?r=t.style:t.getStyle?r=(o,n)=>t.getStyle(e,o,n):r=Ae(),r}function Ae(){return(t,r)=>new p.Style({image:new p.Circle({radius:5,fill:new p.Fill({color:"red"})})})}function ke(e,t={}){const r=t.token||"dadcbbdb5206b626a29ca739686b3087",o=t.baseType||"img",n=t.noteType||"cia",s=new L.Tile({className:"tdt-base-layer",source:new w.XYZ({url:`http://t0.tianditu.com/DataServer?T=${o}_w&x={x}&y={y}&l={z}&tk=${r}`,maxZoom:t.maxZoom||18,minZoom:t.minZoom||2}),zIndex:t.zIndex||1});s.set("name","tdt-base-layer");const a=new L.Tile({className:"tdt-base-layer",source:new w.XYZ({url:`http://t0.tianditu.com/DataServer?T=${n}_w&x={x}&y={y}&l={z}&tk=${r}`,maxZoom:t.maxZoom||18,minZoom:t.minZoom||2}),zIndex:t.zIndex?t.zIndex+1:2});return a.set("name","tdt-baseNote-layer"),e.addLayer(s),e.addLayer(a),s}function Q(e,t,r,o){(!o||!o.type)&&(o=Object.assign({},r,o));const n=o.type||"Point";let s;switch(n){case"GeoJSON":s=Re(t,r,e,o);break;case"Wms":s=Ne(t,e,o);break;case"Point":case"LineString":case"MultiLineString":case"Polygon":case"MultiPolygon":s=je(t,r,e,o);break;case"Circle":s=pe(t,r,e,o);break;case"Overlay":s=ze(t,e,o);break}return s}function Oe(e,t){Array.isArray(t)?t.forEach(r=>{J(e,r)}):J(e,t)}function Re(e,t,r,o){console.log(typeof t,t);const n=new A.GeoJSON().readFeatures(t,{dataProjection:"EPSG:4326",featureProjection:"EPSG:4326"}),s=new w.Vector;s.addFeatures(n);const a=new L.Vector({source:s,style:O(e,o),zIndex:o.zIndex||10});return a.set("name",e),a.set("type","webgl"),r.addLayer(a),a}function Ne(e,t,r){const o=new L.Tile({opacity:r.opacity||1,source:xe(e,r),zIndex:r.zIndex||10});return o.set("name",e),t.addLayer(o),o}function je(e,t,r,o){if(!t||t.length===0)return null;const n=new L.Vector({source:Me(e,t,o),style:O(e,o),zIndex:o.zIndex||10});return n.set("name",e),n.set("type","webgl"),r.addLayer(n),n}function pe(e,t,r,o){const n=k(t),s=Se(n,o.radius,{steps:300,units:"meters"}),a=new A.GeoJSON().readFeature(s,{dataProjection:"EPSG:4326",featureProjection:"EPSG:4490"}),c=new w.Vector({wrapX:!1});c.addFeature(a);const i=new L.Vector({source:c,style:O(e,o),zIndex:o.zIndex?o.zIndex:10});return i.set("name",e),i.set("type","webgl"),r.addLayer(i),i}function ze(e,t,r){const o=document.createElement("div"),n=new le({element:o,stopEvent:!1,positioning:r.positioning||"bottom-center"});return n.set("name",e),n.set("type","webgl"),t.addOverlay(n),{overlayer:n,content:o}}function Ze(e,t,r){const o=new L.Vector({source:new w.Vector({wrapX:!1}),zIndex:r.zIndex?r.zIndex:10,style:O(t,r)});return o.set("name",t),o.set("type","webgl"),e.addLayer(o),o}function Z(e,t){return e.getAllLayers().find(n=>n.get("name")===t)}function qe(e,t,r){const o=Z(e,t);return o.setVisible(r),o}const E=new Map,x={},v={},_e=(e,t)=>{E.has(e)&&console.warn(`Map with target '${e}' already exists. Overwriting...`),E.set(e,t),x[e]&&(x[e].forEach(r=>r(t)),delete x[e]),v[e]&&(v[e].forEach(r=>r(t)),delete v[e])};function X(e){const t=E.get(e);return t?Promise.resolve(t):new Promise(r=>{v[e]=v[e]||[],v[e].push(r)})}const Ve=e=>{E.has(e)&&(E.delete(e),delete x[e])},Y=(e,t)=>{const r=E.get(e);if(r){t(r);return}x[e]||(x[e]=[]),x[e].push(t)};function Ce(e,t={}){if(!e&&!e.target)throw new Error("is not a valid element");arguments.length===1&&typeof e=="object"&&(t=e,e=t.target);const o=Object.assign({zoom:10,center:[104.064839,30.548857],minZoom:2,maxZoom:19,projection:"EPSG:4326"},t),n=new $.Map({target:e,layers:[],view:new $.View({projection:o.projection,center:o.center,zoom:o.zoom,minZoom:o.minZoom,maxZoom:o.maxZoom}),controls:fe.defaults({zoom:!1,rotate:!1,attribution:!1})});return n.targetId=e,n}function $e(e,t,r,o){Q(e,t,r,j(N({},o),{type:"Point"}))}function K(e,t,r){return new Promise((o,n)=>{e.getView().animate({center:t,duration:r.duration||1e3,zoom:r.zoom||te(e),rotation:r.rotation||0,easing:r.easing},o)})}function ee(e,t){const r=(t.extend[0]+t.extend[2])/2,o=(t.extend[1]+t.extend[3])/2;return K(e,[r,o],t)}function Be(e,t,r){const o=t.getGeometry().getExtent();return ee(e,j(N({},r),{extend:o}))}function Ge(e){return e.getView().getProjection()}function te(e){return e.getView().getZoom()}function We(e,t){e.getView().setZoom(t)}function Je(e,t){e.un("click",()=>{}),e.un("pointermove",()=>{}),Ve(t)}let M=null;function De(e,t={}){const r=new A.GeoJSON;M=new ge({condition:ye.click,multi:t.multi||!1,style:c=>{if(typeof t.getStyle=="function"){const i=c.get("layerName");return t.getStyle(i,c)}else return t.style},layers:t.layers?c=>t.layers.includes(c):void 0}),e.addInteraction(M);const o=M.getFeatures(),n=c=>I(null,null,function*(){const i=(t.layers||e.getLayers().getArray()).filter(h=>{const b=h.getSource();return h.getVisible()&&(b instanceof w.TileWMS||b instanceof w.ImageWMS)});if(i.length===0)return;const l=e.getView(),d=i.map(h=>I(null,null,function*(){const f=h.getSource().getFeatureInfoUrl(c.coordinate,l.getResolution(),l.getProjection(),{INFO_FORMAT:"application/json",FEATURE_COUNT:1});if(f)try{const S=yield(yield fetch(f)).json();if(S.features&&S.features.length>0){const m=r.readFeatures(S);return m.forEach(y=>{y.set("wms_layer_source",h),y.set("wms_event_source",c),y.set("layerName",h.get("name"))}),m}}catch(F){console.warn(F)}return[]})),u=(yield Promise.all(d)).flat();u.length>0&&(t.multi,o.extend(u),M.dispatchEvent({type:"select",selected:u,deselected:[],mapBrowserEvent:c}))});e.on("singleclick",n);const s=new Set;M.on("select",c=>{const i=o.getArray();if(i.length>0){const l=i.map(d=>({feature:d,properties:d.getProperties(),layer:d.get("wms_layer_source")||M.getLayer(d),event:d.get("wms_event_source")||c}));a(l)}else a(null)});const a=c=>s.forEach(i=>i(c));return{onSelect:c=>(s.add(c),()=>s.delete(c)),clear:()=>{s.clear(),o.clear()},destroy:()=>{e.removeInteraction(M),e.un("singleclick",n),s.clear()}}}function Ue(e,t={}){var P;const r=new A.GeoJSON,o=(P=t.debounceTime)!=null?P:200,n=new w.Vector,s=new L.Vector({source:n,map:e,style:t.style,zIndex:1e4,properties:{title:"JG_HOVER_LAYER"}});let a=null,c=null;const i=new Set,l=(u,h,b)=>{const f=u[0];if(a!==f)if(a=f,n.clear(),f?(n.addFeature(f),t.cursor!==!1&&(e.getTargetElement().style.cursor="pointer")):t.cursor!==!1&&(e.getTargetElement().style.cursor=""),f){const F={feature:f,layer:h,properties:f.getProperties(),coordinate:b};i.forEach(S=>S([F]))}else i.forEach(F=>F(null))},d=u=>{if(u.dragging)return;const h=u.pixel,b=u.coordinate;let f=!1;if(e.forEachFeatureAtPixel(h,(m,y)=>{f||y!==s&&(t.layers&&!t.layers.includes(y)||(f=!0,c&&clearTimeout(c),l([m],y,b)))}),f)return;a&&(a=null,n.clear(),e.getTargetElement().style.cursor="",i.forEach(m=>m(null))),c&&clearTimeout(c);const S=(t.layers||e.getLayers().getArray()).filter(m=>{const y=m.getSource();return m.getVisible()&&(y instanceof w.TileWMS||y instanceof w.ImageWMS)});S.length!==0&&(c=setTimeout(()=>I(null,null,function*(){const m=e.getView();for(const y of S){const q=y.getSource().getFeatureInfoUrl(b,m.getResolution(),m.getProjection(),{INFO_FORMAT:"application/json",FEATURE_COUNT:1});if(q)try{const R=yield(yield fetch(q)).json();if(R.features&&R.features.length>0){const _=r.readFeatures(R);_.forEach(ne=>ne.set("wms_layer_source",y)),l(_,y,b);return}}catch(re){}}}),o))};return e.on("pointermove",d),{onHover:u=>(i.add(u),()=>i.delete(u)),clear:()=>{n.clear(),a=null},destroy:()=>{e.un("pointermove",d),e.removeLayer(s),i.clear(),c&&clearTimeout(c)}}}const He=(e,t)=>{const r=Ce(e,t);ke(r,t.baseLayers);const o={targetId:e,instance:r,addMarker:(n,s,a)=>$e(r,n,s,a),createLayer:(n,s,a)=>Q(r,n,s,a),createBlankLayer:(n,s)=>Ze(r,n,s),visibleLayer:(n,s)=>qe(r,n,s),removeLayer:n=>Oe(r,n),getLonLat:n=>k(n),getLayerByName:n=>Z(r,n),getSourceByName:n=>H(r,n),createSelect:n=>De(r,n),createHover:n=>Ue(r,n),queryFeature:(n,s)=>Fe(r,n,s),lightFeature:(n,s,a,c)=>U(n,s,a,c),flashFeature:(n,s,a)=>Le(n,s,a),flyTo:(n,s)=>K(r,n,s),flyToByExtent:n=>ee(r,n),flyToByFeature:(n,s)=>Be(r,n,s),getProjection:()=>Ge(r),getZoom:()=>te(r),setZoom:n=>We(r,n),getMapContext:n=>X(n),onMapReady:(n,s)=>Y(n,s),destroyMap:()=>Je(r,e)};return _e(e,o),o};function Qe(e,t){Y(e,t)}function Xe(e){return X(e)}exports.getMapContext=Xe;exports.onMapReady=Qe;exports.useMap=He;