egovamap 0.17.20 → 0.17.21

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.
@@ -1,468 +1,468 @@
1
- import CoordConvConfig from './coordconvert/CoordConvConfig';
2
- var coordConvert=require('egovacoordconvert/index');
3
- var MapUtils = {
4
- type: function (obj) {
5
- var result = Array.isArray(obj) ? 'array' : (typeof obj);
6
- return result;
7
- },
8
- deepClones: function () {
9
- var options,
10
- name,
11
- src,
12
- copy,
13
- copyIsArray,
14
- clone,
15
- target = arguments[0] || {},
16
- i = 1,
17
- length = arguments.length,
18
- deep = false;
19
-
20
- // Handle a deep copy situation
21
- if (typeof target === "boolean") {
22
- deep = target;
23
-
24
- // Skip the boolean and the target
25
- target = arguments[i] || {};
26
- i++;
27
- }
28
-
29
- // Handle case when target is a string or something (possible in deep copy)
30
- if (this.type(target) !== "object" && this.type(target) !== 'function' && this.type(target) !== 'array') {
31
- target = {};
32
- }
33
-
34
- // Extend jQuery itself if only one argument is passed
35
- if (i === length) {
36
- target = this;
37
- i--;
38
- }
39
-
40
- for (; i < length; i++) {
41
-
42
- // Only deal with non-null/undefined values
43
- if ((options = arguments[i]) != null) {
44
-
45
- // Extend the base object
46
- for (name in options) {
47
- src = target[name];
48
- copy = options[name];
49
-
50
- // Prevent never-ending loop
51
- if (target === copy) {
52
- continue;
53
- }
54
-
55
- // Recurse if we're merging plain objects or arrays
56
- if (deep && copy && (this.type(copy) === "object" ||
57
- (copyIsArray = (this.type(copy) === "array")))) {
58
-
59
- if (copyIsArray) {
60
- copyIsArray = false;
61
- clone = src && (this.type(copy) === "array") ? src : [];
62
-
63
- } else {
64
- clone = src && (this.type(copy) === "object") ? src : {};
65
- }
66
-
67
- // Never move original objects, clone them
68
- target[name] = this.deepClones(deep, clone, copy);
69
-
70
- // Don't bring in undefined values
71
- } else if (copy !== undefined) {
72
- target[name] = copy;
73
- }
74
- }
75
- }
76
- }
77
- // Return the modified object
78
- return target;
79
- },
80
- //初始化
81
- init:function(context){
82
- var coordConvertType=context.coordConvertType;
83
- var coordParam=context.coordConvertParam;
84
- var nullParamTypes=['BJCG','GPS','MKT','84ll2bdll','84ll2gcjll','84ll2bdmc','GD'];
85
- if(coordConvertType){
86
- if(nullParamTypes.toString().indexOf(coordConvertType)!=-1){
87
- this.convertType=coordConvertType;//正转类型
88
- this.coordParam='';
89
- this.unCoordParam='';
90
- if(coordConvertType=='BJCG')
91
- this.unConvertType='unBJCG2WGS84';//北京城管转84经纬度
92
- if(coordConvertType=='GPS')
93
- this.unConvertType='GPS';
94
- if(coordConvertType=='MKT')
95
- this.unConvertType='84mc284ll';
96
- if(coordConvertType=='84ll2bdll')
97
- this.unConvertType='bdll284ll';
98
- if(coordConvertType=='84ll2gcjll')
99
- this.unConvertType='gcjll284ll';
100
- if(coordConvertType=='84ll2bdmc')
101
- this.unConvertType='bdmc2bdll,bdll284ll';//先转百度经纬度再转84经纬度
102
- if(coordConvertType=='GD')
103
- this.unConvertType='gcjmc2gcjll,gcjll284ll';//先转高德经纬度再转84经纬度
104
- }
105
- else{
106
- this.convertType='YDCL';
107
- this.unConvertType='xy284ll';
108
- this.coordParam=coordParam||CoordConvConfig.coordConvert4Params;
109
- this.unCoordParam=context.unCoordConvertParam||CoordConvConfig.coordConvert4ParamsReverse;//反转参数
110
- }
111
-
112
- }
113
- else{
114
- this.convertType='GPS';//没有提供类型不做转换
115
- this.unConvertType='GPS';
116
- }
117
- },
118
-
119
- //限制经纬度坐标在一个正确范围
120
- limitLon: function (x) {
121
- x = x > 180 ? 180 : x;
122
- x = x < -180 ? -180 : x;
123
- return x;
124
- },
125
-
126
-
127
- //限制经纬度坐标在一个正确范围
128
- limitLat: function (y) {
129
- y = y > 90 ? 90 : y;
130
- y = y < -90 ? -90 : y;
131
- return y;
132
- },
133
-
134
- //限制经纬度坐标在一个正确范围
135
- limitLonLatArray: function (arrPnts) {
136
- var result = [];
137
- var length = arrPnts.length;
138
- for (var k = 0; k < length; ++k) {
139
- result.push([this.limitLon(arrPnts[k][0]), this.limitLat(arrPnts[k][1])]);
140
- }
141
- return result;
142
- },
143
-
144
- //坐标变换,本地转经纬度,返回 {x, y}格式
145
- toLonLat: function (x, y) {
146
- if(this.unConvertType=='GPS'){
147
- var resultPoint = {
148
- x: x,
149
- y: y
150
- };
151
- return resultPoint;
152
- }
153
- if (this.unConvertType&&this.unConvertType.split(',').length==1){
154
- var factory = coordConvert.getConvertFactory(this.unConvertType,this.unCoordParam);
155
- var result = factory.convert(x,y);
156
- var resultPoint = {
157
- x: this.limitLon(result[0]),
158
- y: this.limitLat(result[1])
159
- };
160
-
161
- }else if(this.unConvertType&&this.unConvertType.split(',').length>1){
162
- //需要两次转换
163
- var unConvertTps=this.unConvertType.split(',');
164
- var factory = coordConvert.getConvertFactory(unConvertTps[0],this.unCoordParam);
165
- var result = factory.convert(x,y);
166
- var factory2 = coordConvert.getConvertFactory(unConvertTps[1],this.unCoordParam);
167
- result = factory2.convert(result[0],result[1]);
168
- var resultPoint = {
169
- x: this.limitLon(result[0]),
170
- y: this.limitLat(result[1])
171
- };
172
- }
173
- else
174
- var resultPoint = {
175
- x: x,
176
- y: y
177
- };
178
- return resultPoint;
179
- },
180
-
181
- //批量坐标变换,本地转经纬度,返回坐标点对数组,传入形式[[100.0, 0.0], [101.0, 1.0]]传出形式相同
182
- toLonLatArray: function (arrPnts) {
183
- if (arrPnts.length == 0) {
184
- return arrPnts;
185
- }
186
- if (this.unConvertType=='GPS')
187
- return arrPnts;
188
- if (this.unConvertType&&this.unConvertType.split(',').length==1){
189
- var factory = coordConvert.getConvertFactory(this.unConvertType,this.unCoordParam);
190
- }else if(this.unConvertType&&this.unConvertType.split(',').length>1){
191
- //需要两次转换
192
- var unConvertTps=this.unConvertType.split(',');
193
- var factory = coordConvert.getConvertFactory(unConvertTps[0],this.unCoordParam);
194
- var factory2 = coordConvert.getConvertFactory(unConvertTps[1],this.unCoordParam);
195
- }else
196
- return arrPnts;
197
- var resultPoints=[];
198
- for(var i = 0; i < arrPnts.length; i++){
199
- var pnt=arrPnts[i];
200
- var temp = factory.convert(pnt[0],pnt[1]);
201
- if(factory2){
202
- var temp2=factory2.convert(temp[0],temp[1]);
203
- }
204
- else
205
- var temp2=temp;
206
- resultPoints.push([this.limitLon(temp2[0]),this.limitLat(temp2[1])]);
207
- }
208
- return resultPoints;
209
- },
210
-
211
- //坐标变换,经纬度转本地,返回 {x, y}格式
212
- toLocal: function (x, y) {
213
- if (this.convertType){
214
- var factory = coordConvert.getConvertFactory(this.convertType,this.coordParam);
215
- var result = factory.convert(x,y);
216
- var resultPoint = {
217
- x: result[0],
218
- y: result[1]
219
- };
220
-
221
- }else
222
- var resultPoint = {
223
- x: x,
224
- y: y
225
- };
226
- return resultPoint;
227
- },
228
-
229
- //批量坐标变换,经纬度转本地,返回坐标点对数组,输入形式 [[100.0, 0.0], [101.0, 1.0]],输出形式相同
230
- toLocalArray: function (arrPnts) {
231
- if (arrPnts.length == 0) {
232
- return arrPnts;
233
- }
234
- if (this.convertType){
235
- var factory = coordConvert.getConvertFactory(this.convertType,this.coordParam);
236
- }
237
- else
238
- return arrPnts;
239
- var resultPoints=[];
240
- for(var i = 0; i < arrPnts.length; i++){
241
- var pnt=arrPnts[i];
242
- var temp = factory.convert(pnt[0],pnt[1]);
243
- resultPoints.push([temp[0],temp[1]]);
244
- }
245
- return resultPoints;
246
- },
247
-
248
- //二维地图范围转成三维经纬度地图范围
249
- toLonLatExtent: function (extent) {
250
- var lowerleft = this.toLonLat(extent.xmin, extent.ymin);
251
- var upperright = this.toLonLat(extent.xmax, extent.ymax);
252
- if (lowerleft && upperright) {
253
- return {
254
- "xmin": lowerleft.x,
255
- "ymin": lowerleft.y,
256
- "xmax": upperright.x,
257
- "ymax": upperright.y
258
- };
259
- }
260
- },
261
-
262
- //三维经纬度地图范围转成二维地图范围
263
- toLocalExtent: function (extent) {
264
- var lowerleft = this.toLocal(extent.west || extent.xmin, extent.south || extent.ymin);
265
- var upperright = this.toLocal(extent.east || extent.xmax, extent.north || extent.ymax);
266
- if (lowerleft && upperright) {
267
- return {
268
- "xmin": lowerleft.x,
269
- "ymin": lowerleft.y,
270
- "xmax": upperright.x,
271
- "ymax": upperright.y
272
- };
273
- }
274
- },
275
- //其它坐标转换 坐标形式coord=[116.9,40.12]
276
- commonConvert:function(type,param,coord){
277
- var factory = coordConvert.getConvertFactory(type,param);
278
- var result =factory.convert(coord[0],coord[1]);
279
- return result;
280
- },
281
-
282
- //转换geoserver面数据转为geojson
283
- convertRingsToGeoJSON : function(rings){
284
- function isNumber(n) {
285
- return !isNaN(parseFloat(n)) && isFinite(n);
286
- }
287
-
288
- function ringIsClockwise(ringToTest) {
289
- var total = 0,
290
- i = 0;
291
- var rLength = ringToTest.length;
292
- var pt1 = ringToTest[i];
293
- var pt2;
294
- for (i; i < rLength - 1; i++) {
295
- pt2 = ringToTest[i + 1];
296
- total += (pt2[0] - pt1[0]) * (pt2[1] + pt1[1]);
297
- pt1 = pt2;
298
- }
299
- return (total >= 0);
300
- }
301
-
302
- function closeRing(coordinates) {
303
- if (!pointsEqual(coordinates[0], coordinates[coordinates.length - 1])) {
304
- coordinates.push(coordinates[0]);
305
- }
306
- return coordinates;
307
- }
308
-
309
- // checks if 2 x,y points are equal
310
- function pointsEqual(a, b) {
311
- for (var i = 0; i < a.length; i++) {
312
- if (a[i] !== b[i]) {
313
- return false;
314
- }
315
- }
316
- return true;
317
- }
318
-
319
- function coordinatesContainPoint(coordinates, point) {
320
- var contains = false;
321
- for (var i = -1, l = coordinates.length, j = l - 1; ++i < l; j = i) {
322
- if (((coordinates[i][1] <= point[1] && point[1] < coordinates[j][1]) ||
323
- (coordinates[j][1] <= point[1] && point[1] < coordinates[i][1])) &&
324
- (point[0] < (coordinates[j][0] - coordinates[i][0]) * (point[1] - coordinates[i][1]) / (coordinates[j][1] - coordinates[i][1]) + coordinates[i][0])) {
325
- contains = !contains;
326
- }
327
- }
328
- return contains;
329
- }
330
-
331
- function edgeIntersectsEdge(a1, a2, b1, b2) {
332
- var ua_t = (b2[0] - b1[0]) * (a1[1] - b1[1]) - (b2[1] - b1[1]) * (a1[0] - b1[0]);
333
- var ub_t = (a2[0] - a1[0]) * (a1[1] - b1[1]) - (a2[1] - a1[1]) * (a1[0] - b1[0]);
334
- var u_b = (b2[1] - b1[1]) * (a2[0] - a1[0]) - (b2[0] - b1[0]) * (a2[1] - a1[1]);
335
-
336
- if (u_b !== 0) {
337
- var ua = ua_t / u_b;
338
- var ub = ub_t / u_b;
339
-
340
- if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {
341
- return true;
342
- }
343
- }
344
-
345
- return false;
346
- }
347
-
348
- function arraysIntersectArrays(a, b) {
349
- if (isNumber(a[0][0])) {
350
- if (isNumber(b[0][0])) {
351
- for (var i = 0; i < a.length - 1; i++) {
352
- for (var j = 0; j < b.length - 1; j++) {
353
- if (edgeIntersectsEdge(a[i], a[i + 1], b[j], b[j + 1])) {
354
- return true;
355
- }
356
- }
357
- }
358
- } else {
359
- for (var k = 0; k < b.length; k++) {
360
- if (arraysIntersectArrays(a, b[k])) {
361
- return true;
362
- }
363
- }
364
- }
365
- } else {
366
- for (var l = 0; l < a.length; l++) {
367
- if (arraysIntersectArrays(a[l], b)) {
368
- return true;
369
- }
370
- }
371
- }
372
- return false;
373
- }
374
-
375
- function coordinatesContainCoordinates(outer, inner) {
376
- var intersects = arraysIntersectArrays(outer, inner);
377
- var contains = coordinatesContainPoint(outer, inner[0]);
378
- if (!intersects && contains) {
379
- return true;
380
- }
381
- return false;
382
- }
383
-
384
- var outerRings = [];
385
- var holes = [];
386
- var x; // iterator
387
- var outerRing; // current outer ring being evaluated
388
- var hole; // current hole being evaluated
389
-
390
- // for each ring
391
- for (var r = 0; r < rings.length; r++) {
392
- var ring = closeRing(rings[r].slice(0));
393
- if (ring.length < 4) {
394
- continue;
395
- }
396
- // is this ring an outer ring? is it clockwise?
397
- if (ringIsClockwise(ring)) {
398
- var polygon = [ring.slice().reverse()]; // wind outer rings counterclockwise for RFC 7946 compliance
399
- outerRings.push(polygon); // push to outer rings
400
- } else {
401
- holes.push(ring.slice().reverse()); // wind inner rings clockwise for RFC 7946 compliance
402
- }
403
- }
404
-
405
- var uncontainedHoles = [];
406
-
407
- // while there are holes left...
408
- while (holes.length) {
409
- // pop a hole off out stack
410
- hole = holes.pop();
411
-
412
- // loop over all outer rings and see if they contain our hole.
413
- var contained = false;
414
- for (x = outerRings.length - 1; x >= 0; x--) {
415
- outerRing = outerRings[x][0];
416
- if (coordinatesContainCoordinates(outerRing, hole)) {
417
- // the hole is contained push it into our polygon
418
- outerRings[x].push(hole);
419
- contained = true;
420
- break;
421
- }
422
- }
423
-
424
- // ring is not contained in any outer ring
425
- // sometimes this happens https://github.com/Esri/esri-leaflet/issues/320
426
- if (!contained) {
427
- uncontainedHoles.push(hole);
428
- }
429
- }
430
-
431
- // if we couldn't match any holes using contains we can now try intersects...
432
- while (uncontainedHoles.length) {
433
- // pop a hole off out stack
434
- hole = uncontainedHoles.pop();
435
-
436
- // loop over all outer rings and see if any intersect our hole.
437
- var intersects = false;
438
- for (x = outerRings.length - 1; x >= 0; x--) {
439
- outerRing = outerRings[x][0];
440
- if (arraysIntersectArrays(outerRing, hole)) {
441
- // the hole intersects the outer ring push it into our polygon
442
- outerRings[x].push(hole);
443
- intersects = true;
444
- break;
445
- }
446
- }
447
-
448
- // hole does not intersect ANY outer ring at this point
449
- // make it an outer ring.
450
- if (!intersects) {
451
- outerRings.push([hole.reverse()]);
452
- }
453
- }
454
-
455
- if (outerRings.length === 1) {
456
- return {
457
- type: 'Polygon',
458
- coordinates: outerRings[0]
459
- };
460
- } else {
461
- return {
462
- type: 'MultiPolygon',
463
- coordinates: outerRings
464
- };
465
- }
466
- }
467
- }
1
+ import CoordConvConfig from './coordconvert/CoordConvConfig';
2
+ var coordConvert=require('egovacoordconvert/index');
3
+ var MapUtils = {
4
+ type: function (obj) {
5
+ var result = Array.isArray(obj) ? 'array' : (typeof obj);
6
+ return result;
7
+ },
8
+ deepClones: function () {
9
+ var options,
10
+ name,
11
+ src,
12
+ copy,
13
+ copyIsArray,
14
+ clone,
15
+ target = arguments[0] || {},
16
+ i = 1,
17
+ length = arguments.length,
18
+ deep = false;
19
+
20
+ // Handle a deep copy situation
21
+ if (typeof target === "boolean") {
22
+ deep = target;
23
+
24
+ // Skip the boolean and the target
25
+ target = arguments[i] || {};
26
+ i++;
27
+ }
28
+
29
+ // Handle case when target is a string or something (possible in deep copy)
30
+ if (this.type(target) !== "object" && this.type(target) !== 'function' && this.type(target) !== 'array') {
31
+ target = {};
32
+ }
33
+
34
+ // Extend jQuery itself if only one argument is passed
35
+ if (i === length) {
36
+ target = this;
37
+ i--;
38
+ }
39
+
40
+ for (; i < length; i++) {
41
+
42
+ // Only deal with non-null/undefined values
43
+ if ((options = arguments[i]) != null) {
44
+
45
+ // Extend the base object
46
+ for (name in options) {
47
+ src = target[name];
48
+ copy = options[name];
49
+
50
+ // Prevent never-ending loop
51
+ if (target === copy) {
52
+ continue;
53
+ }
54
+
55
+ // Recurse if we're merging plain objects or arrays
56
+ if (deep && copy && (this.type(copy) === "object" ||
57
+ (copyIsArray = (this.type(copy) === "array")))) {
58
+
59
+ if (copyIsArray) {
60
+ copyIsArray = false;
61
+ clone = src && (this.type(copy) === "array") ? src : [];
62
+
63
+ } else {
64
+ clone = src && (this.type(copy) === "object") ? src : {};
65
+ }
66
+
67
+ // Never move original objects, clone them
68
+ target[name] = this.deepClones(deep, clone, copy);
69
+
70
+ // Don't bring in undefined values
71
+ } else if (copy !== undefined) {
72
+ target[name] = copy;
73
+ }
74
+ }
75
+ }
76
+ }
77
+ // Return the modified object
78
+ return target;
79
+ },
80
+ //初始化
81
+ init:function(context){
82
+ var coordConvertType=context.coordConvertType;
83
+ var coordParam=context.coordConvertParam;
84
+ var nullParamTypes=['BJCG','GPS','MKT','84ll2bdll','84ll2gcjll','84ll2bdmc','GD'];
85
+ if(coordConvertType){
86
+ if(nullParamTypes.toString().indexOf(coordConvertType)!=-1){
87
+ this.convertType=coordConvertType;//正转类型
88
+ this.coordParam='';
89
+ this.unCoordParam='';
90
+ if(coordConvertType=='BJCG')
91
+ this.unConvertType='unBJCG2WGS84';//北京城管转84经纬度
92
+ if(coordConvertType=='GPS')
93
+ this.unConvertType='GPS';
94
+ if(coordConvertType=='MKT')
95
+ this.unConvertType='84mc284ll';
96
+ if(coordConvertType=='84ll2bdll')
97
+ this.unConvertType='bdll284ll';
98
+ if(coordConvertType=='84ll2gcjll')
99
+ this.unConvertType='gcjll284ll';
100
+ if(coordConvertType=='84ll2bdmc')
101
+ this.unConvertType='bdmc2bdll,bdll284ll';//先转百度经纬度再转84经纬度
102
+ if(coordConvertType=='GD')
103
+ this.unConvertType='gcjmc2gcjll,gcjll284ll';//先转高德经纬度再转84经纬度
104
+ }
105
+ else{
106
+ this.convertType='YDCL';
107
+ this.unConvertType='xy284ll';
108
+ this.coordParam=coordParam||CoordConvConfig.coordConvert4Params;
109
+ this.unCoordParam=context.unCoordConvertParam||CoordConvConfig.coordConvert4ParamsReverse;//反转参数
110
+ }
111
+
112
+ }
113
+ else{
114
+ this.convertType='GPS';//没有提供类型不做转换
115
+ this.unConvertType='GPS';
116
+ }
117
+ },
118
+
119
+ //限制经纬度坐标在一个正确范围
120
+ limitLon: function (x) {
121
+ x = x > 180 ? 180 : x;
122
+ x = x < -180 ? -180 : x;
123
+ return x;
124
+ },
125
+
126
+
127
+ //限制经纬度坐标在一个正确范围
128
+ limitLat: function (y) {
129
+ y = y > 90 ? 90 : y;
130
+ y = y < -90 ? -90 : y;
131
+ return y;
132
+ },
133
+
134
+ //限制经纬度坐标在一个正确范围
135
+ limitLonLatArray: function (arrPnts) {
136
+ var result = [];
137
+ var length = arrPnts.length;
138
+ for (var k = 0; k < length; ++k) {
139
+ result.push([this.limitLon(arrPnts[k][0]), this.limitLat(arrPnts[k][1])]);
140
+ }
141
+ return result;
142
+ },
143
+
144
+ //坐标变换,本地转经纬度,返回 {x, y}格式
145
+ toLonLat: function (x, y) {
146
+ if(this.unConvertType=='GPS'){
147
+ var resultPoint = {
148
+ x: x,
149
+ y: y
150
+ };
151
+ return resultPoint;
152
+ }
153
+ if (this.unConvertType&&this.unConvertType.split(',').length==1){
154
+ var factory = coordConvert.getConvertFactory(this.unConvertType,this.unCoordParam);
155
+ var result = factory.convert(x,y);
156
+ var resultPoint = {
157
+ x: this.limitLon(result[0]),
158
+ y: this.limitLat(result[1])
159
+ };
160
+
161
+ }else if(this.unConvertType&&this.unConvertType.split(',').length>1){
162
+ //需要两次转换
163
+ var unConvertTps=this.unConvertType.split(',');
164
+ var factory = coordConvert.getConvertFactory(unConvertTps[0],this.unCoordParam);
165
+ var result = factory.convert(x,y);
166
+ var factory2 = coordConvert.getConvertFactory(unConvertTps[1],this.unCoordParam);
167
+ result = factory2.convert(result[0],result[1]);
168
+ var resultPoint = {
169
+ x: this.limitLon(result[0]),
170
+ y: this.limitLat(result[1])
171
+ };
172
+ }
173
+ else
174
+ var resultPoint = {
175
+ x: x,
176
+ y: y
177
+ };
178
+ return resultPoint;
179
+ },
180
+
181
+ //批量坐标变换,本地转经纬度,返回坐标点对数组,传入形式[[100.0, 0.0], [101.0, 1.0]]传出形式相同
182
+ toLonLatArray: function (arrPnts) {
183
+ if (arrPnts.length == 0) {
184
+ return arrPnts;
185
+ }
186
+ if (this.unConvertType=='GPS')
187
+ return arrPnts;
188
+ if (this.unConvertType&&this.unConvertType.split(',').length==1){
189
+ var factory = coordConvert.getConvertFactory(this.unConvertType,this.unCoordParam);
190
+ }else if(this.unConvertType&&this.unConvertType.split(',').length>1){
191
+ //需要两次转换
192
+ var unConvertTps=this.unConvertType.split(',');
193
+ var factory = coordConvert.getConvertFactory(unConvertTps[0],this.unCoordParam);
194
+ var factory2 = coordConvert.getConvertFactory(unConvertTps[1],this.unCoordParam);
195
+ }else
196
+ return arrPnts;
197
+ var resultPoints=[];
198
+ for(var i = 0; i < arrPnts.length; i++){
199
+ var pnt=arrPnts[i];
200
+ var temp = factory.convert(pnt[0],pnt[1]);
201
+ if(factory2){
202
+ var temp2=factory2.convert(temp[0],temp[1]);
203
+ }
204
+ else
205
+ var temp2=temp;
206
+ resultPoints.push([this.limitLon(temp2[0]),this.limitLat(temp2[1])]);
207
+ }
208
+ return resultPoints;
209
+ },
210
+
211
+ //坐标变换,经纬度转本地,返回 {x, y}格式
212
+ toLocal: function (x, y) {
213
+ if (this.convertType){
214
+ var factory = coordConvert.getConvertFactory(this.convertType,this.coordParam);
215
+ var result = factory.convert(x,y);
216
+ var resultPoint = {
217
+ x: result[0],
218
+ y: result[1]
219
+ };
220
+
221
+ }else
222
+ var resultPoint = {
223
+ x: x,
224
+ y: y
225
+ };
226
+ return resultPoint;
227
+ },
228
+
229
+ //批量坐标变换,经纬度转本地,返回坐标点对数组,输入形式 [[100.0, 0.0], [101.0, 1.0]],输出形式相同
230
+ toLocalArray: function (arrPnts) {
231
+ if (arrPnts.length == 0) {
232
+ return arrPnts;
233
+ }
234
+ if (this.convertType){
235
+ var factory = coordConvert.getConvertFactory(this.convertType,this.coordParam);
236
+ }
237
+ else
238
+ return arrPnts;
239
+ var resultPoints=[];
240
+ for(var i = 0; i < arrPnts.length; i++){
241
+ var pnt=arrPnts[i];
242
+ var temp = factory.convert(pnt[0],pnt[1]);
243
+ resultPoints.push([temp[0],temp[1]]);
244
+ }
245
+ return resultPoints;
246
+ },
247
+
248
+ //二维地图范围转成三维经纬度地图范围
249
+ toLonLatExtent: function (extent) {
250
+ var lowerleft = this.toLonLat(extent.xmin, extent.ymin);
251
+ var upperright = this.toLonLat(extent.xmax, extent.ymax);
252
+ if (lowerleft && upperright) {
253
+ return {
254
+ "xmin": lowerleft.x,
255
+ "ymin": lowerleft.y,
256
+ "xmax": upperright.x,
257
+ "ymax": upperright.y
258
+ };
259
+ }
260
+ },
261
+
262
+ //三维经纬度地图范围转成二维地图范围
263
+ toLocalExtent: function (extent) {
264
+ var lowerleft = this.toLocal(extent.west || extent.xmin, extent.south || extent.ymin);
265
+ var upperright = this.toLocal(extent.east || extent.xmax, extent.north || extent.ymax);
266
+ if (lowerleft && upperright) {
267
+ return {
268
+ "xmin": lowerleft.x,
269
+ "ymin": lowerleft.y,
270
+ "xmax": upperright.x,
271
+ "ymax": upperright.y
272
+ };
273
+ }
274
+ },
275
+ //其它坐标转换 坐标形式coord=[116.9,40.12]
276
+ commonConvert:function(type,param,coord){
277
+ var factory = coordConvert.getConvertFactory(type,param);
278
+ var result =factory.convert(coord[0],coord[1]);
279
+ return result;
280
+ },
281
+
282
+ //转换geoserver面数据转为geojson
283
+ convertRingsToGeoJSON : function(rings){
284
+ function isNumber(n) {
285
+ return !isNaN(parseFloat(n)) && isFinite(n);
286
+ }
287
+
288
+ function ringIsClockwise(ringToTest) {
289
+ var total = 0,
290
+ i = 0;
291
+ var rLength = ringToTest.length;
292
+ var pt1 = ringToTest[i];
293
+ var pt2;
294
+ for (i; i < rLength - 1; i++) {
295
+ pt2 = ringToTest[i + 1];
296
+ total += (pt2[0] - pt1[0]) * (pt2[1] + pt1[1]);
297
+ pt1 = pt2;
298
+ }
299
+ return (total >= 0);
300
+ }
301
+
302
+ function closeRing(coordinates) {
303
+ if (!pointsEqual(coordinates[0], coordinates[coordinates.length - 1])) {
304
+ coordinates.push(coordinates[0]);
305
+ }
306
+ return coordinates;
307
+ }
308
+
309
+ // checks if 2 x,y points are equal
310
+ function pointsEqual(a, b) {
311
+ for (var i = 0; i < a.length; i++) {
312
+ if (a[i] !== b[i]) {
313
+ return false;
314
+ }
315
+ }
316
+ return true;
317
+ }
318
+
319
+ function coordinatesContainPoint(coordinates, point) {
320
+ var contains = false;
321
+ for (var i = -1, l = coordinates.length, j = l - 1; ++i < l; j = i) {
322
+ if (((coordinates[i][1] <= point[1] && point[1] < coordinates[j][1]) ||
323
+ (coordinates[j][1] <= point[1] && point[1] < coordinates[i][1])) &&
324
+ (point[0] < (coordinates[j][0] - coordinates[i][0]) * (point[1] - coordinates[i][1]) / (coordinates[j][1] - coordinates[i][1]) + coordinates[i][0])) {
325
+ contains = !contains;
326
+ }
327
+ }
328
+ return contains;
329
+ }
330
+
331
+ function edgeIntersectsEdge(a1, a2, b1, b2) {
332
+ var ua_t = (b2[0] - b1[0]) * (a1[1] - b1[1]) - (b2[1] - b1[1]) * (a1[0] - b1[0]);
333
+ var ub_t = (a2[0] - a1[0]) * (a1[1] - b1[1]) - (a2[1] - a1[1]) * (a1[0] - b1[0]);
334
+ var u_b = (b2[1] - b1[1]) * (a2[0] - a1[0]) - (b2[0] - b1[0]) * (a2[1] - a1[1]);
335
+
336
+ if (u_b !== 0) {
337
+ var ua = ua_t / u_b;
338
+ var ub = ub_t / u_b;
339
+
340
+ if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {
341
+ return true;
342
+ }
343
+ }
344
+
345
+ return false;
346
+ }
347
+
348
+ function arraysIntersectArrays(a, b) {
349
+ if (isNumber(a[0][0])) {
350
+ if (isNumber(b[0][0])) {
351
+ for (var i = 0; i < a.length - 1; i++) {
352
+ for (var j = 0; j < b.length - 1; j++) {
353
+ if (edgeIntersectsEdge(a[i], a[i + 1], b[j], b[j + 1])) {
354
+ return true;
355
+ }
356
+ }
357
+ }
358
+ } else {
359
+ for (var k = 0; k < b.length; k++) {
360
+ if (arraysIntersectArrays(a, b[k])) {
361
+ return true;
362
+ }
363
+ }
364
+ }
365
+ } else {
366
+ for (var l = 0; l < a.length; l++) {
367
+ if (arraysIntersectArrays(a[l], b)) {
368
+ return true;
369
+ }
370
+ }
371
+ }
372
+ return false;
373
+ }
374
+
375
+ function coordinatesContainCoordinates(outer, inner) {
376
+ var intersects = arraysIntersectArrays(outer, inner);
377
+ var contains = coordinatesContainPoint(outer, inner[0]);
378
+ if (!intersects && contains) {
379
+ return true;
380
+ }
381
+ return false;
382
+ }
383
+
384
+ var outerRings = [];
385
+ var holes = [];
386
+ var x; // iterator
387
+ var outerRing; // current outer ring being evaluated
388
+ var hole; // current hole being evaluated
389
+
390
+ // for each ring
391
+ for (var r = 0; r < rings.length; r++) {
392
+ var ring = closeRing(rings[r].slice(0));
393
+ if (ring.length < 4) {
394
+ continue;
395
+ }
396
+ // is this ring an outer ring? is it clockwise?
397
+ if (ringIsClockwise(ring)) {
398
+ var polygon = [ring.slice().reverse()]; // wind outer rings counterclockwise for RFC 7946 compliance
399
+ outerRings.push(polygon); // push to outer rings
400
+ } else {
401
+ holes.push(ring.slice().reverse()); // wind inner rings clockwise for RFC 7946 compliance
402
+ }
403
+ }
404
+
405
+ var uncontainedHoles = [];
406
+
407
+ // while there are holes left...
408
+ while (holes.length) {
409
+ // pop a hole off out stack
410
+ hole = holes.pop();
411
+
412
+ // loop over all outer rings and see if they contain our hole.
413
+ var contained = false;
414
+ for (x = outerRings.length - 1; x >= 0; x--) {
415
+ outerRing = outerRings[x][0];
416
+ if (coordinatesContainCoordinates(outerRing, hole)) {
417
+ // the hole is contained push it into our polygon
418
+ outerRings[x].push(hole);
419
+ contained = true;
420
+ break;
421
+ }
422
+ }
423
+
424
+ // ring is not contained in any outer ring
425
+ // sometimes this happens https://github.com/Esri/esri-leaflet/issues/320
426
+ if (!contained) {
427
+ uncontainedHoles.push(hole);
428
+ }
429
+ }
430
+
431
+ // if we couldn't match any holes using contains we can now try intersects...
432
+ while (uncontainedHoles.length) {
433
+ // pop a hole off out stack
434
+ hole = uncontainedHoles.pop();
435
+
436
+ // loop over all outer rings and see if any intersect our hole.
437
+ var intersects = false;
438
+ for (x = outerRings.length - 1; x >= 0; x--) {
439
+ outerRing = outerRings[x][0];
440
+ if (arraysIntersectArrays(outerRing, hole)) {
441
+ // the hole intersects the outer ring push it into our polygon
442
+ outerRings[x].push(hole);
443
+ intersects = true;
444
+ break;
445
+ }
446
+ }
447
+
448
+ // hole does not intersect ANY outer ring at this point
449
+ // make it an outer ring.
450
+ if (!intersects) {
451
+ outerRings.push([hole.reverse()]);
452
+ }
453
+ }
454
+
455
+ if (outerRings.length === 1) {
456
+ return {
457
+ type: 'Polygon',
458
+ coordinates: outerRings[0]
459
+ };
460
+ } else {
461
+ return {
462
+ type: 'MultiPolygon',
463
+ coordinates: outerRings
464
+ };
465
+ }
466
+ }
467
+ }
468
468
  export default MapUtils;