@steedos/standard-object-database 2.5.10 → 2.5.11-beta.10
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/main/default/client/coordtransform.client.js +153 -0
- package/main/default/objectTranslations/object_fields.en/object_fields.en.objectTranslation.yml +6 -0
- package/main/default/objectTranslations/object_fields.zh-CN/object_fields.zh-CN.objectTranslation.yml +6 -0
- package/main/default/objects/object_fields.object.yml +8 -0
- package/main/default/objects/object_layouts.object.yml +1 -1
- package/main/default/triggers/object_fields.trigger.js +31 -0
- package/main/default/triggers/object_listviews.trigger.js +11 -0
- package/package.json +2 -2
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Created by Wandergis on 2015/7/8.
|
|
3
|
+
* 提供了百度坐标(BD-09)、国测局坐标(火星坐标,GCJ-02)、和 WGS-84 坐标系之间的转换
|
|
4
|
+
*/
|
|
5
|
+
// UMD 魔法代码
|
|
6
|
+
// if the module has no dependencies, the above pattern can be simplified to
|
|
7
|
+
(function (root, factory) {
|
|
8
|
+
if (typeof define === 'function' && define.amd) {
|
|
9
|
+
// AMD. Register as an anonymous module.
|
|
10
|
+
define([], factory);
|
|
11
|
+
} else if (typeof module === 'object' && module.exports) {
|
|
12
|
+
// Node. Does not work with strict CommonJS, but
|
|
13
|
+
// only CommonJS-like environments that support module.exports,
|
|
14
|
+
// like Node.
|
|
15
|
+
module.exports = factory();
|
|
16
|
+
} else {
|
|
17
|
+
// Browser globals (root is window)
|
|
18
|
+
root.coordtransform = factory();
|
|
19
|
+
}
|
|
20
|
+
}(window, function () {
|
|
21
|
+
// 定义一些常量
|
|
22
|
+
var x_PI = 3.14159265358979324 * 3000.0 / 180.0;
|
|
23
|
+
var PI = 3.1415926535897932384626;
|
|
24
|
+
var a = 6378245.0;
|
|
25
|
+
var ee = 0.00669342162296594323;
|
|
26
|
+
/**
|
|
27
|
+
* 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02) 的转换
|
|
28
|
+
* 即 百度 转 谷歌、高德
|
|
29
|
+
* @param bd_lng
|
|
30
|
+
* @param bd_lat
|
|
31
|
+
* @returns {*[]}
|
|
32
|
+
*/
|
|
33
|
+
var bd09togcj02 = function bd09togcj02(bd_lng, bd_lat) {
|
|
34
|
+
var bd_lng = +bd_lng;
|
|
35
|
+
var bd_lat = +bd_lat;
|
|
36
|
+
var x = bd_lng - 0.0065;
|
|
37
|
+
var y = bd_lat - 0.006;
|
|
38
|
+
var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);
|
|
39
|
+
var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);
|
|
40
|
+
var gg_lng = z * Math.cos(theta);
|
|
41
|
+
var gg_lat = z * Math.sin(theta);
|
|
42
|
+
return [gg_lng, gg_lat]
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
|
|
47
|
+
* 即 谷歌、高德 转 百度
|
|
48
|
+
* @param lng
|
|
49
|
+
* @param lat
|
|
50
|
+
* @returns {*[]}
|
|
51
|
+
*/
|
|
52
|
+
var gcj02tobd09 = function gcj02tobd09(lng, lat) {
|
|
53
|
+
var lat = +lat;
|
|
54
|
+
var lng = +lng;
|
|
55
|
+
var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
|
|
56
|
+
var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
|
|
57
|
+
var bd_lng = z * Math.cos(theta) + 0.0065;
|
|
58
|
+
var bd_lat = z * Math.sin(theta) + 0.006;
|
|
59
|
+
return [bd_lng, bd_lat]
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* WGS-84 转 GCJ-02
|
|
64
|
+
* @param lng
|
|
65
|
+
* @param lat
|
|
66
|
+
* @returns {*[]}
|
|
67
|
+
*/
|
|
68
|
+
var wgs84togcj02 = function wgs84togcj02(lng, lat) {
|
|
69
|
+
var lat = +lat;
|
|
70
|
+
var lng = +lng;
|
|
71
|
+
if (out_of_china(lng, lat)) {
|
|
72
|
+
return [lng, lat]
|
|
73
|
+
} else {
|
|
74
|
+
var dlat = transformlat(lng - 105.0, lat - 35.0);
|
|
75
|
+
var dlng = transformlng(lng - 105.0, lat - 35.0);
|
|
76
|
+
var radlat = lat / 180.0 * PI;
|
|
77
|
+
var magic = Math.sin(radlat);
|
|
78
|
+
magic = 1 - ee * magic * magic;
|
|
79
|
+
var sqrtmagic = Math.sqrt(magic);
|
|
80
|
+
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
|
|
81
|
+
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
|
|
82
|
+
var mglat = lat + dlat;
|
|
83
|
+
var mglng = lng + dlng;
|
|
84
|
+
return [mglng, mglat]
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* GCJ-02 转换为 WGS-84
|
|
90
|
+
* @param lng
|
|
91
|
+
* @param lat
|
|
92
|
+
* @returns {*[]}
|
|
93
|
+
*/
|
|
94
|
+
var gcj02towgs84 = function gcj02towgs84(lng, lat) {
|
|
95
|
+
var lat = +lat;
|
|
96
|
+
var lng = +lng;
|
|
97
|
+
if (out_of_china(lng, lat)) {
|
|
98
|
+
return [lng, lat]
|
|
99
|
+
} else {
|
|
100
|
+
var dlat = transformlat(lng - 105.0, lat - 35.0);
|
|
101
|
+
var dlng = transformlng(lng - 105.0, lat - 35.0);
|
|
102
|
+
var radlat = lat / 180.0 * PI;
|
|
103
|
+
var magic = Math.sin(radlat);
|
|
104
|
+
magic = 1 - ee * magic * magic;
|
|
105
|
+
var sqrtmagic = Math.sqrt(magic);
|
|
106
|
+
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
|
|
107
|
+
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
|
|
108
|
+
var mglat = lat + dlat;
|
|
109
|
+
var mglng = lng + dlng;
|
|
110
|
+
return [lng * 2 - mglng, lat * 2 - mglat]
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
var transformlat = function transformlat(lng, lat) {
|
|
115
|
+
var lat = +lat;
|
|
116
|
+
var lng = +lng;
|
|
117
|
+
var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
|
|
118
|
+
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
|
|
119
|
+
ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
|
|
120
|
+
ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
|
|
121
|
+
return ret
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
var transformlng = function transformlng(lng, lat) {
|
|
125
|
+
var lat = +lat;
|
|
126
|
+
var lng = +lng;
|
|
127
|
+
var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
|
|
128
|
+
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
|
|
129
|
+
ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
|
|
130
|
+
ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
|
|
131
|
+
return ret
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* 判断是否在国内,不在国内则不做偏移
|
|
136
|
+
* @param lng
|
|
137
|
+
* @param lat
|
|
138
|
+
* @returns {boolean}
|
|
139
|
+
*/
|
|
140
|
+
var out_of_china = function out_of_china(lng, lat) {
|
|
141
|
+
var lat = +lat;
|
|
142
|
+
var lng = +lng;
|
|
143
|
+
// 纬度 3.86~53.55, 经度 73.66~135.05
|
|
144
|
+
return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
bd09togcj02: bd09togcj02,
|
|
149
|
+
gcj02tobd09: gcj02tobd09,
|
|
150
|
+
wgs84togcj02: wgs84togcj02,
|
|
151
|
+
gcj02towgs84: gcj02towgs84
|
|
152
|
+
}
|
|
153
|
+
}));
|
package/main/default/objectTranslations/object_fields.en/object_fields.en.objectTranslation.yml
CHANGED
|
@@ -65,6 +65,8 @@ fields:
|
|
|
65
65
|
value: url
|
|
66
66
|
- label: Email
|
|
67
67
|
value: email
|
|
68
|
+
- label: Location
|
|
69
|
+
value: location
|
|
68
70
|
- label: Image
|
|
69
71
|
value: image
|
|
70
72
|
- label: File
|
|
@@ -86,6 +88,10 @@ fields:
|
|
|
86
88
|
label: Group
|
|
87
89
|
help:
|
|
88
90
|
description:
|
|
91
|
+
coordinatesType:
|
|
92
|
+
label: Coordinates Type
|
|
93
|
+
help:
|
|
94
|
+
description:
|
|
89
95
|
reference_to:
|
|
90
96
|
label: Reference to
|
|
91
97
|
help:
|
|
@@ -62,6 +62,8 @@ fields:
|
|
|
62
62
|
value: url
|
|
63
63
|
- label: 邮件地址
|
|
64
64
|
value: email
|
|
65
|
+
- label: 地理位置
|
|
66
|
+
value: location
|
|
65
67
|
- label: 图片
|
|
66
68
|
value: image
|
|
67
69
|
- label: 附件
|
|
@@ -79,6 +81,10 @@ fields:
|
|
|
79
81
|
label: 字段分组
|
|
80
82
|
help:
|
|
81
83
|
description:
|
|
84
|
+
coordinatesType:
|
|
85
|
+
label: 坐标类型
|
|
86
|
+
help:
|
|
87
|
+
description:
|
|
82
88
|
reference_to:
|
|
83
89
|
label: 引用对象
|
|
84
90
|
help:
|
|
@@ -86,6 +86,8 @@ fields:
|
|
|
86
86
|
value: url
|
|
87
87
|
- label: Email
|
|
88
88
|
value: email
|
|
89
|
+
- label: Location
|
|
90
|
+
value: location
|
|
89
91
|
- label: Image
|
|
90
92
|
value: image
|
|
91
93
|
- label: File
|
|
@@ -210,6 +212,12 @@ fields:
|
|
|
210
212
|
type: text
|
|
211
213
|
label: Group
|
|
212
214
|
sort_no: 170
|
|
215
|
+
coordinatesType:
|
|
216
|
+
type: text
|
|
217
|
+
label: 坐标类型
|
|
218
|
+
sort_no: 175
|
|
219
|
+
defaultValue: bd09
|
|
220
|
+
visible_on: "{{['location'].indexOf(formData.type) > -1 ? true: false}}"
|
|
213
221
|
reference_to:
|
|
214
222
|
type: lookup
|
|
215
223
|
label: Reference to
|
|
@@ -373,5 +373,36 @@ module.exports = {
|
|
|
373
373
|
if( ["parent","children"].indexOf(field.name) > -1 && enable_tree ){
|
|
374
374
|
throw new Meteor.Error(500, "启用树状结构显示记录的对象不能删除parent、children字段。");
|
|
375
375
|
}
|
|
376
|
+
},
|
|
377
|
+
|
|
378
|
+
afterInsert: async function () {
|
|
379
|
+
const { doc } = this;
|
|
380
|
+
const { type, name, object: objectName } = doc;
|
|
381
|
+
// 如果是地理位置字段,则需立即创建索引,否则mongodb查询地理位置字段时会报错 'unable to find index for $geoNear query' on server'
|
|
382
|
+
if (type === 'location') {
|
|
383
|
+
const defaultAdapter = objectql.getDataSource('default').adapter
|
|
384
|
+
await defaultAdapter.connect();
|
|
385
|
+
const collection = defaultAdapter.collection(objectName);
|
|
386
|
+
|
|
387
|
+
try {
|
|
388
|
+
const indexInfo = {
|
|
389
|
+
key: {
|
|
390
|
+
[`${name}.wgs84`]: "2dsphere"
|
|
391
|
+
},
|
|
392
|
+
name: `c2_${name}_wgs84`,
|
|
393
|
+
unique: false,
|
|
394
|
+
sparse: false,
|
|
395
|
+
background: true
|
|
396
|
+
}
|
|
397
|
+
const key = indexInfo.key;
|
|
398
|
+
try {
|
|
399
|
+
await collection.createIndex(key, indexInfo)
|
|
400
|
+
} catch (error) {
|
|
401
|
+
// DO NOTHING
|
|
402
|
+
}
|
|
403
|
+
} catch (error) {
|
|
404
|
+
console.error(error)
|
|
405
|
+
}
|
|
406
|
+
}
|
|
376
407
|
}
|
|
377
408
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const InternalData = require('@steedos/standard-objects').internalData;
|
|
2
2
|
const util = require('@steedos/standard-objects').util;
|
|
3
3
|
const objectql = require('@steedos/objectql');
|
|
4
|
+
const auth = require("@steedos/auth");
|
|
4
5
|
|
|
5
6
|
const getInternalListviews = async function(sourceListviews, filters, is_system){
|
|
6
7
|
let collection = await objectql.getObject("object_listviews");
|
|
@@ -21,6 +22,16 @@ const getInternalListviews = async function(sourceListviews, filters, is_system)
|
|
|
21
22
|
|
|
22
23
|
module.exports = {
|
|
23
24
|
beforeInsert: async function () {
|
|
25
|
+
const { userId, spaceId } = this;
|
|
26
|
+
if(userId && spaceId){
|
|
27
|
+
const userSession = await auth.getSessionByUserId(userId, spaceId);
|
|
28
|
+
if(userSession){
|
|
29
|
+
const { allowCreateListViews } = await objectql.getObject("object_listviews").getUserObjectPermission(userSession, false);
|
|
30
|
+
if(!allowCreateListViews){
|
|
31
|
+
throw new Error('没有权限创建视图')
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
24
35
|
if (!this.doc.name) {
|
|
25
36
|
this.doc.name = 'listview_' + this.doc._id.toLowerCase();
|
|
26
37
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steedos/standard-object-database",
|
|
3
|
-
"version": "2.5.10",
|
|
3
|
+
"version": "2.5.11-beta.10",
|
|
4
4
|
"main": "package.service.js",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -15,5 +15,5 @@
|
|
|
15
15
|
},
|
|
16
16
|
"repository": {},
|
|
17
17
|
"license": "MIT",
|
|
18
|
-
"gitHead": "
|
|
18
|
+
"gitHead": "15896005ccd3119b38ed36350900d28fd6e75e35"
|
|
19
19
|
}
|