@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.
@@ -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
+ }));
@@ -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
@@ -84,7 +84,7 @@ fields:
84
84
  type: grid
85
85
  blackbox: true
86
86
  is_wide: true
87
- hidden: true
87
+ hidden: false
88
88
  field_groups.$.group_name:
89
89
  type: text
90
90
  fields:
@@ -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": "b918b6237fcf33152033429f055d5707d3cf0e02"
18
+ "gitHead": "15896005ccd3119b38ed36350900d28fd6e75e35"
19
19
  }