Question List in September, 2021

🍂 We know something different, there is nowhere that can make yourself happy by doing nothing.

走不以手,缚手走不能疾;飞不以尾,屈尾飞不能远;物之用者必待不用者。故使之见者,乃不见者也;使鼓鸣者,乃不鸣者也。尝一脔肉,知一镌之味;悬羽与炭,而知燥湿之气;以小明大。见一叶落,而知岁之将暮;睹瓶中之冰,而知天下之寒;以近论远。

刘安及其门客《淮南子·说山训》

1、Hello, ArcGIS Server

近日来,屡次与 ArcGIS Server 合作,发现了这个软件的好用之处,暂且记录一下。首先是关于软件的安装,Server 是可以独立与 ArcMap 而存在的,但是其服务发布必须依赖于服务定义文件(.sd)。

1.1 时间查询

  1. 将 “2021-09-01” 格式的字符串字段转换为日期字段可以用字段计算器中的 cdate([日期]) 函数;

  2. 按年查询时间字段可以使用参考文献 1 中关于日期的标准函数 EXTRACT(YEAR FROM “日期”) 来进行;而更为通用的时间查询需要用 date '2021-09-01' 的形式对传入字符作日期转换;

  3. ArcGIS Server 中 Query 的 Where 语句与 ArcMap 中的 “按属性查询” 功能里的 Where 语句基本通用;

  4. 关于统计查询需要借助参考文献 2 中的 ArcGIS REST API 或类似于参考文献 3 中关于 ArcGIS Server 服务分组查询的相关属性如 GroupByFieldsForStatistics 和 OutStatices 的配置。

1.2 服务定义文件

参考文献

  1. ArcGIS Enterprise.ArcGIS Server 中支持的 SQL 函数[EB/OL].

  2. ArcGIS Developers.Summarize Attributes[EB/OL].

  3. CSDN博客.ArcGIS 10.1 for Server 服务端查询统计 -ArcGIS API for Silverlight 实现[EB/OL].

  4. 简书. ArcMap生成.sd文件,在ArcGIS Server发布地图服务[EB/OL].

  5. ArcGIS Server.发布服务定义文件[EB/OL].

2、能源集团大屏展示系统

2.1 合并 JSON 对象

JavaScript 合并 JSON 对应通常有几种方法:循环遍历法、Object.assign(); 法、jQuery.extend() 法;对于简单需求而言,使用这三种方法都能达到需要的效果,而对于复杂 JSON 来说,使用 jQuery 的 extend() 方法的第二个原型,使用深拷贝技术进行 JSON 对象合并即可达到要求:

$.extend([deep], target, object1 [, objectN]);

从结果来看,合并后的数据是完整的,并且合并后再修改源对象,并没有影响到合并结果,这说明合并拷贝是深拷贝,并不是引用拷贝,是一款不错的 API。另外 ES6 提供了新的 API,也可以实现 JSON 数据的合并:

json1.push(...json2);

这里涉及到 ... 的语法以及 ES5 和 ES6 的故事:

展开语法 ...

展开语法 Spread syntax 是一种可以在函数调用/数组构造时,将数组表达式或者 String 在语法层面展开的语法结构;还可以在构造字面量对象时,将对象表达式按 key-value 的方式展开。这里的字面量一般指 [1, 2, 3] 或者 {name: "mdn"} 这种简洁的构造方式。一个较为简单的示例是将数组元素迭代为函数参数:

function fun(x, y, z){}
let args = [0, 1, 2];
fun.apply(null, args);

``Function.prototype.apply()`` 方法调用一个具有给定 this 值的函数,以及以一个数组或类数组对象的形式提供的参数。注意:call() 方法的作用和 apply() 方法类似,区别就是 call() 方法接受的是参数列表,而apply()方法接受的是一个参数数组

将上面的调用方式用展开语法 ... 来替换,可以是如下的形式:

function fun(x, y, z){}
let args = [0, 1, 2];
fun(...args);

实际上, 展开语法和 `Object.assign() <https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign>`__ 行为一致, 执行的都是只遍历一层的浅拷贝。另外在数组或函数参数中使用展开语法时,该语法只能用于可迭代对象,像 var obj = {'key':'value'} 这种形式的对象使用展开语法进行展开 var array = [...obj] 时将会报错。

ES5 与 ES6

JavaScript 的标准是 ECMAScript 。截至 2012 年,所有的现代浏览器都完整的支持 ECMAScript 5.1,旧版本的浏览器至少支持 ECMAScript 3 标准。2015年6月17日,ECMA国际组织发布了 ECMAScript 的第六版,该版本正式名称为 ECMAScript 2015,但通常被称为 ECMAScript 6 或者 ES6。自此,ECMAScript 每年发布一次新标准。

ECMAScript 是一种由 ECMA 国际(European Computer Manufacturers Association,前身为欧洲计算机制造商协会)通过 ECMA-262 标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为 JavaScript 或 JScript,但事实上后两者是ECMA-262标准的实现和扩展。

2.2 JSON 对象与数组

JSON 对象的声明一般使用 let json = {}; 而数组对象的声明则一般使用 let array = []; 。如果错把 array 当做 json 来使用则会在用 for 循环遍历 key, value 时会在最终结果中额外附加一些函数声明。

2.3 回调函数作用域

类内的回调函数的作用域似乎不是类本身,其中的 this 指向的好像是全局变量。回调函数、闭包。

参考文献

  1. 博客园.合并JSON对象的正确方式[EB/OL].

  2. 简书.合并两个json数据[EB/OL].

  3. MDN Web Docs. Function.prototype.apply()[EB/OL].

  4. MDN Web Docs.展开语法[EB/OL].

  5. CSDN博客.JS中回调函数、作用域及闭包详解[EB/OL].

  6. CSDN博客.Cesium闪烁[EB/OL].

  7. CSDN博客.CesiumGIF布告板[EB/OL].

  8. CSDN博客.CesiumGIF布告板[EB/OL].

3、其他事项

3.1 更新 ReadTheDocs 云端博客

长久没登录 GitHub,再次在本地提交代码时居然提示:

remote: Support for password authentication was removed on August 13, 2021.

纳尼!查了下百度,原来是 Github 程序员在七夕搞了一波事情。自 2021-8-13 日起 Github 不再提供远程终端账户密码登录,而是需要使用网站生成 Token 进行使用。具体位置是:

个人设置界面\(\rightarrow\)Settings\(\rightarrow\)Developer setting\(\rightarrow\)Personal access tokens\(\rightarrow\)Generate new token.

使用时将 token 放到原来密码的位置即可。

3.2 基于 Python 的 3dtiles 几何误差修改工具

Python 读取 JSON 文件

import os
import json
file = open(path, "r+") #以读写方式打开文件:r只读,r+读写,w只写,w+读写
json = json.load(file)  #读取文件内容并转换为JSON对象

其中 r+ 形式如果文件不存在时会报错;w+ 在文件不存在时会创建。

Python 写入 JSON 文件

data = ['a':1,'b':2,'c':3]
file = open(path, "r+")
# 另一种写法 with open('data.json', 'r') as f:
json.dump(data, file, indent=4)

其中 indent=4 意在将 JSON 文件格式化保存输出;另外如果要清空文件内容并覆盖的话,最好还是使用文件指针定位函数 f.seek(0) 定位到文件头,然后用 f.truncate() 截断当前位置后所有字符,然后再保存。

Python 列出文件夹下所有文件

dirs = os.listdir(folder)             #列出所有文件,包括文件夹
is_dir = os.path.isdir(dirs[0])       #判断是否是文件夹
file_info = os.path.splitext(dirs[0]) #获取文件名及后缀
                                      #file_info[0] 为文件名
                                      #file_info[1] 为后缀,形如 .json
dirs.sort(key=lambda x: int(x[:-5])   #截取.json后缀文件的文件名数字进行排序

参考文献

  1. CSDN. github开发人员在七夕搞事情[EB/OL].

  2. 博客园. python txt文件读写(追加、覆盖)[EB/OL].

  3. 百度经验.python写入已有文件前怎么清空内容[EB/OL].