jxing %!s(int64=4) %!d(string=hai) anos
pai
achega
4ee5830000
Modificáronse 34 ficheiros con 733 adicións e 91 borrados
  1. 6 1
      docs/dev/data-center/index.js
  2. 6 0
      docs/dev/data-center/relations/belongs/Bd2Sp.md
  3. 5 0
      docs/dev/data-center/relations/belongs/Eq2Bd.md
  4. 6 0
      docs/dev/data-center/relations/belongs/Eq2Sh.md
  5. 1 0
      docs/dev/data-center/relations/belongs/Eq2Sp.md
  6. 5 0
      docs/dev/data-center/relations/belongs/Fl2Fl.md
  7. 6 0
      docs/dev/data-center/relations/belongs/Pe2Bd.md
  8. 6 0
      docs/dev/data-center/relations/belongs/Pe2Fl.md
  9. 6 0
      docs/dev/data-center/relations/belongs/Pe2Sh.md
  10. 6 0
      docs/dev/data-center/relations/belongs/Pe2Sp.md
  11. 5 0
      docs/dev/data-center/relations/belongs/Sh2Bd.md
  12. 6 0
      docs/dev/data-center/relations/belongs/Sh2Sh.md
  13. 7 1
      docs/dev/data-center/relations/belongs/Sp2Sp.md
  14. 24 2
      docs/dev/data-center/relations/belongs/Sp2Sp2.md
  15. 0 34
      docs/dev/data-center/relations/belongs/Sp2Sp_new.md
  16. 8 2
      docs/dev/data-center/relations/belongs/Sy2Bd.md
  17. 8 2
      docs/dev/data-center/relations/belongs/Sy2Fl.md
  18. 8 2
      docs/dev/data-center/relations/belongs/Sy2Sh.md
  19. 7 1
      docs/dev/data-center/relations/belongs/Sy2Sp.md
  20. 6 0
      docs/dev/data-center/relations/belongs/f_rel_calc.md
  21. 0 0
      docs/dev/data-center/relations/belongs/img/sp2sp2-1.png
  22. 9 3
      docs/dev/data-center/relations/other/calc_area_v3.md
  23. BIN=BIN
      docs/dev/data-center/relations/other/img/rel_cilin-1.png
  24. 88 0
      docs/dev/data-center/relations/other/is_point_in_polygon_v1.md
  25. 126 0
      docs/dev/data-center/relations/other/is_point_in_polygon_v2.md
  26. 142 0
      docs/dev/data-center/relations/other/is_point_in_polygon_v3.md
  27. 34 13
      docs/dev/data-center/relations/other/calc_vertically_overlap.md
  28. 6 0
      docs/dev/data-center/relations/other/other_ispace_floor_overlap.md
  29. 5 5
      docs/dev/data-center/relations/other/rel_affected_space.md
  30. 43 0
      docs/dev/data-center/relations/other/rel_cilin_str_similar.md
  31. 5 5
      docs/dev/data-center/relations/other/rel_str_similar.md
  32. 110 0
      docs/dev/data-center/relations/other/sim.md
  33. 20 13
      docs/dev/data-center/relations/topology/sys_block.md
  34. 13 7
      docs/dev/data-center/relations/topology/sys_direction.md

+ 6 - 1
docs/dev/data-center/index.js

@@ -44,10 +44,15 @@ const content = [
         path: "/dev/data-center/relations/",
         children: [
             ["/dev/data-center/relations/other/calc_area_v3", "计算业务空间面积"],
-            ["/dev/data-center/relations/other/calc_vertically_overlap", "计算业务空间是否在垂直方向重叠"],
             ["/dev/data-center/relations/other/other_ispace_floor_overlap", "计算元空间轮廓是否与楼层轮廓重叠"],
             ["/dev/data-center/relations/other/rel_affected_space", "计算受影响的业务空间"],
             ["/dev/data-center/relations/other/rel_str_similar", "计算字符串相似度"],
+            ["/dev/data-center/relations/other/is_vertically_overlap", "业务空间垂直方向的交通关系"],
+            ["/dev/data-center/relations/other/is_point_in_polygon_v1", "判断点是否在楼层轮廓内"],
+            ["/dev/data-center/relations/other/is_point_in_polygon_v2", "判断点是否在元空间轮廓内"],
+            ["/dev/data-center/relations/other/is_point_in_polygon_v3", "判断点是否在业务空间轮廓内"],
+            ["/dev/data-center/relations/other/rel_cilin_str_similar", "词林相似度算法"],
+            ["/dev/data-center/relations/other/sim", "词林相似度算法详细文档"],
         ]
     },
     {

+ 6 - 0
docs/dev/data-center/relations/belongs/Bd2Sp.md

@@ -16,6 +16,10 @@ update zone_space_base zone set zone.building_id = floor.building_id from floor
 ```
 
 # 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 CREATE OR REPLACE FUNCTION "public"."rel_bd2sp"("tables" text, "project_id" varchar)
   RETURNS "pg_catalog"."bool" AS $BODY$
@@ -37,6 +41,8 @@ $BODY$
   COST 100
 ```
 
+</details>
+
 ## 输入
     1. 参与计算的表的全名称, 带schema名, 以英文逗号隔开
     2. 项目id

+ 5 - 0
docs/dev/data-center/relations/belongs/Eq2Bd.md

@@ -20,6 +20,9 @@ UPDATE equipment SET building_id = (SELECT building_id FROM "floor" WHERE id = e
 
 # 函数
 
+<details>
+<summary>源码</summary>
+
 ```plpython
 create or replace function public.rel_eq2bd(project_id character varying) returns boolean
 as
@@ -38,6 +41,8 @@ $$
 LANGUAGE 'plpython3u' VOLATILE;
 ```
 
+</details>
+
 
 ## 入参
     1. 项目id

+ 6 - 0
docs/dev/data-center/relations/belongs/Eq2Sh.md

@@ -10,6 +10,10 @@
     1. 通过 竖井 --> 业务空间 --> 设备 的间接所属关系, 推出竖井和设备的关系
     
 ## 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 -- 设备所在竖井
 create or replace function public.rel_eq2sh(project_id character varying) returns boolean
@@ -44,6 +48,8 @@ $$
 LANGUAGE 'plpython3u' VOLATILE;
 ```
 
+</details>
+
 ## 入参
     1. 项目id
     

+ 1 - 0
docs/dev/data-center/relations/belongs/Eq2Sp.md

@@ -12,6 +12,7 @@
 
 # 函数
 ## 代码
+
 <details>
 <summary>源码</summary>
 

+ 5 - 0
docs/dev/data-center/relations/belongs/Fl2Fl.md

@@ -11,6 +11,9 @@ FROM floor WHERE project_id='Pj4201050001' AND model_id is not null
 
 # 函数
 
+<details>
+<summary>源码</summary>
+
 ```
 create or replace function public.rel_fl2fl(project_id character varying, sign1 integer, sign2 integer) returns boolean
 as
@@ -39,6 +42,8 @@ $$
 LANGUAGE 'plpython3u' VOLATILE;
 ```
 
+</details>
+
 ## 输入
     1. 项目id
     2. 表示r_fl_through_fl表中要被删除的sign值

+ 6 - 0
docs/dev/data-center/relations/belongs/Pe2Bd.md

@@ -8,6 +8,10 @@
     根据 资产 --> 设备/部件 --> 建筑 的间接从属关系, 来获取资产和建筑的所在关系
     
 ## 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 -- 资产属于建筑体
 create or replace function public.rel_pe2bd(project_id character varying) returns boolean
@@ -30,6 +34,8 @@ LANGUAGE 'plpython3u' VOLATILE;
 select public.rel_pe2bd('Pj1101010015');
 ```
 
+</details>
+
 ## 入参
     1. 项目id
 ## 例子

+ 6 - 0
docs/dev/data-center/relations/belongs/Pe2Fl.md

@@ -8,6 +8,10 @@
     根据 资产 --> 设备/部件 --> 楼层 的间接关系, 来获取资产所在建筑的关系
     
 ## 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 -- 资产属于楼层
 create or replace function public.rel_pe2fl(project_id character varying) returns boolean
@@ -29,6 +33,8 @@ LANGUAGE 'plpython3u' VOLATILE;
 select public.rel_pe2fl('Pj1101010015');
 ```
 
+</details>
+
 ## 入参
     1. 项目id
 ## 例子

+ 6 - 0
docs/dev/data-center/relations/belongs/Pe2Sh.md

@@ -8,6 +8,10 @@
     根据 资产 --> 设备/部件 --> 竖井 的间接关系, 来获取资产所在竖井的关系
     
 ## 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 -- 资产所在竖井
 create or replace function public.rel_pe2sh(project_id character varying) returns boolean
@@ -32,6 +36,8 @@ LANGUAGE 'plpython3u' VOLATILE;
 select public.rel_pe2sh('Pj1101010015');
 ```
 
+</details>
+
 ## 入参
     1. 项目id
 ## 例子

+ 6 - 0
docs/dev/data-center/relations/belongs/Pe2Sp.md

@@ -8,6 +8,10 @@
     根据 资产 --> 设备/部件 --> 业务空间 的间接关系, 来获取资产所在业务空间的关系
     
 ## 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 -- 资产所在业务空间
 create or replace function public.rel_pe2sp(project_id character varying) returns boolean
@@ -37,6 +41,8 @@ LANGUAGE 'plpython3u' VOLATILE;
 select public.rel_pe2sp('Pj1101010015');
 ```
 
+</details>
+
 ## 入参
     1. 项目id
 ## 例子

+ 5 - 0
docs/dev/data-center/relations/belongs/Sh2Bd.md

@@ -9,6 +9,9 @@
     
 # 函数
 
+<details>
+<summary>源码</summary>
+
 ```
 
 CREATE OR REPLACE FUNCTION "public"."rel_sh2bd"("project_id" varchar)
@@ -41,6 +44,8 @@ $BODY$
 select public.rel_sh2bd('Pj1102290002')
 ```
 
+</details>
+
 ## 入参
     1. 项目id
 ## 例子

+ 6 - 0
docs/dev/data-center/relations/belongs/Sh2Sh.md

@@ -5,6 +5,10 @@
     1. 竖井包含有相同的元空间, 则认为两竖井贯通
     (竖井包含元空间的数据是前端做划分)
 ## 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 -- 竖井贯通关系
 create or replace function public.rel_sh2sh(project_id character varying) returns boolean
@@ -52,6 +56,8 @@ LANGUAGE 'plpython3u' VOLATILE;
 select public.rel_sh2sh('Pj1102290002')
 ```
 
+</details>
+
 ## 入参
     1. 项目id
 ## 例子

+ 7 - 1
docs/dev/data-center/relations/belongs/Sp2Sp.md

@@ -1,4 +1,4 @@
-业务空间邻接关系
+# 业务空间邻接关系
 ## 前置条件
     1. 业务空间有所在楼层
     2. 业务空间有外轮廓
@@ -12,6 +12,10 @@
     2. 如果有近似平行的线段, 判断是否相互有投影在线段上, 有投影在线段上, 则认为是两平行线段有重合部分, 业务空间有相邻的可能性
     3. 再判断互相有投影点在对方线段上之后, 判断投影线的长度, 是否小于250mm(墙的最大厚度), 如果小于250mm则认为两空间相邻
 ## 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 create or replace function public.rel_sp2sp1(project_id character varying) returns boolean
 as
@@ -42,6 +46,8 @@ LANGUAGE 'plpython3u' VOLATILE;
 select public.rel_sp2sp1('Pj1101050001')
 ```
 
+</details>
+
 ## 入参
     1. 项目id
 ## 例子

+ 24 - 2
docs/dev/data-center/relations/belongs/Sp2Sp2.md

@@ -1,4 +1,4 @@
-业务空间邻接关系
+# 业务空间邻接关系
 ## 前置条件
     1. 业务空间有所在楼层
     2. 业务空间有外轮廓
@@ -15,10 +15,32 @@
     2. 将上面找到的点, 依次与组内其他业务空间外轮廓做一次点是否在多边形内的判断, 如果在, 则认为该多边形与图中多边形相邻
     
    
-![Image text](./img/sp2sp2-1.PNG)
+![image](./img/sp2sp2-1.png)
+
 
 ## 函数
 
+###  业务空间轮廓结构
+```
+[
+    [
+        [
+            {点坐标},
+            {点坐标}...
+        ], // 子轮廓的外轮廓
+        [
+            {点坐标},
+            {点坐标}...
+        ], // 子轮廓的第n个需要被排除的轮廓
+    ], // 子轮廓
+    [
+        [
+            {点坐标},
+            {点坐标}...
+        ]
+    ],
+]
+```
 
 <details>
 <summary>源码</summary>

+ 0 - 34
docs/dev/data-center/relations/belongs/Sp2Sp_new.md

@@ -1,34 +0,0 @@
-计算业务空间邻接关系
-# 函数依赖于
-    sp2fl
-# 业务空间轮廓结构
-```
-[
-    [
-        [
-            {点坐标},
-            {点坐标}...
-        ], // 子轮廓的外轮廓
-        [
-            {点坐标},
-            {点坐标}...
-        ], // 子轮廓的排除轮廓n
-    ], // 子轮廓
-    [
-        [
-            {点坐标},
-            {点坐标}...
-        ]
-    ],
-]
-```
-# 计算细节
-## 参与计算的业务空间
-    1. 找到项目下所有的楼层
-    2. 按照楼层, 分别找出每个楼层下的业务空间, 将一个楼层下的业务空间分组, 在一个组内计算业务空间的相邻关系
-## 在每个子轮廓的外轮廓的相邻两个顶点的线段上做"开门"操作
-    
-    1. 在线段长度大于等于一个门宽度的时候, 虚拟的在这个线段的两端分别各安装一扇门, 在门打开的过程中(两边都能打开), 扫过的面积如果跟其他空间(比如空间A)的面积有重叠时, 
-    则认为这个空间与空间A相邻, 依次找出所有与该空间相邻的空间.
-    2. 在线段长度不超过一个门的宽度时, 将继续寻找下一个点, 直到长度大于等于一个门的宽度时, 执行1
-    将此过程应用到所有空间上, 找出所有业务空间的相邻关系

+ 8 - 2
docs/dev/data-center/relations/belongs/Sy2Bd.md

@@ -1,4 +1,4 @@
-系统所在建筑
+# 系统所在建筑
 ## 前置条件
     1. 系统下有设备
     2. 系统下的设备有所属建筑的关系
@@ -6,9 +6,13 @@
     Eq2Bd
 ## 处理逻辑
     1. 通过 系统 --> 设备 --> 建筑 的间接关系, 获取系统所在建筑的关系
-    2. 结果存储在 r_sy_in_bd 表中
+    2. 结果存储在 r_sy_in_bd 表中 (先删除以前的自动计算结果)
     
 ## 函数
+
+<details>
+<summary>源码</summary>
+
 ~~~
 -- 系统所在建筑
 CREATE OR REPLACE FUNCTION "public"."rel_sy2bd"("project_id" varchar)
@@ -45,6 +49,8 @@ $BODY$
   COST 100
 ~~~
 
+</details>
+
 ## 入参
     1. 项目id
 ## 例子

+ 8 - 2
docs/dev/data-center/relations/belongs/Sy2Fl.md

@@ -1,4 +1,4 @@
-系统所在楼层
+# 系统所在楼层
 ## 前置条件
     1. 系统下有设备
     2. 系统下的设备有所属楼层关系
@@ -6,8 +6,12 @@
     Eq2Fl
 ## 处理逻辑
     1. 通过 系统 --> 设备 --> 楼层 的间接关系, 获取系统所在楼层的关系
-    2. 计算关系存储在表 r_sy_in_fl 中
+    2. 计算关系存储在表 r_sy_in_fl 中 (先删除以前的自动计算结果)
 ## 函数
+
+<details>
+<summary>源码</summary>
+
 ~~~
 -- 系统所在楼层
 create or replace function public.rel_sy2fl(project_id character varying) returns boolean
@@ -42,6 +46,8 @@ $$
 LANGUAGE 'plpython3u' VOLATILE;
 ~~~
 
+</details>
+
 ## 入参
     1. 项目id
 ## 例子

+ 8 - 2
docs/dev/data-center/relations/belongs/Sy2Sh.md

@@ -1,4 +1,4 @@
-系统所在竖井
+# 系统所在竖井
 ## 前置条件
     1. 系统下有设备
     2. 系统下的设备有所在竖井关系
@@ -6,8 +6,12 @@
     Eq2Sh
 ## 处理逻辑
     1. 根据 系统 --> 设备 --> 竖井 来间接获取系统所属竖井关系
-    2. 计算后的关系存储在表 r_sy_in_sh
+    2. 计算后的关系存储在表 r_sy_in_sh (先删除以前的自动计算结果)
 ## 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 -- 系统所在竖井
 create or replace function public.rel_sy2sh(project_id character varying) returns boolean
@@ -41,6 +45,8 @@ $$
 LANGUAGE 'plpython3u' VOLATILE;
 ```
 
+</details>
+
 ## 输入
     1. 项目id
 

+ 7 - 1
docs/dev/data-center/relations/belongs/Sy2Sp.md

@@ -6,8 +6,12 @@
     Eq2Sp
 ## 处理逻辑
     1. 根据 系统 --> 设备 --> 业务空间 的间接关系, 获取系统和业务空间的关系
-    2. 计算结果存储在r_sy_in_sp_*
+    2. 计算结果存储在r_sy_in_sp中 (先删除以前的自动计算结果)
 ## 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 -- 系统所在楼层
 create or replace function public.rel_sy2sp(project_id character varying) returns boolean
@@ -55,6 +59,8 @@ $BODY$
   COST 100
 ```
 
+</details>
+
 ## 输入
     1. 项目id
 

+ 6 - 0
docs/dev/data-center/relations/belongs/f_rel_calc.md

@@ -7,6 +7,9 @@
 # 函数
 ## 代码
 
+<details>
+<summary>源码</summary>
+
 ```
 CREATE OR REPLACE FUNCTION "public"."f_rel_calc"("func" text, "project_id" varchar, "tables" text, "out_tables" text, "sign1" int4, "sign2" int4)
   RETURNS "pg_catalog"."int4" AS $BODY$
@@ -80,6 +83,9 @@ $BODY$
 例子:
 select public.f_rel_calc('rel_eq2sh', 'Pj*******', 'zone_space_base','relationship.r_eq2sp', 2, 2)
 ```
+
+</details>
+
 ## 输入
     1. 想要计算的函数名
     2. 项目id

docs/dev/data-center/relations/belongs/img/sp2sp2-1.PNG → docs/dev/data-center/relations/belongs/img/sp2sp2-1.png


+ 9 - 3
docs/dev/data-center/relations/other/calc_area_v3.md

@@ -1,17 +1,21 @@
 计算业务空间的面积
 ## 前置条件
 
-
+    业务空间有轮廓数据
 
 ## 处理逻辑
 
-根据业务空间轮廓的格式, 以此计算内部每个小轮廓的面积, 加和在一起为最终结果
-小轮廓面积计算: 计算首个子轮廓面积, 并减去随后所有子轮廓的面积. 结果为小轮廓面积
+    根据业务空间轮廓的格式, 以此计算内部每个小轮廓的面积, 加和在一起为最终结果
+    小轮廓面积计算: 计算首个子轮廓面积, 并减去随后所有子轮廓的面积. 结果为小轮廓面积
 
 ## 实现方式
 
 
 # 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 CREATE OR REPLACE FUNCTION "public"."calc_area_v3"("json_poly" jsonb)
   RETURNS "pg_catalog"."float8" AS $BODY$
@@ -66,6 +70,8 @@ $BODY$
   COST 100
 ```
 
+</details>
+
 ## 输入
     1. 业务空间的轮廓
 

BIN=BIN
docs/dev/data-center/relations/other/img/rel_cilin-1.png


+ 88 - 0
docs/dev/data-center/relations/other/is_point_in_polygon_v1.md

@@ -0,0 +1,88 @@
+# 判断一个点是否在楼层的轮廓里
+## 前置条件
+    
+    楼层必须有轮廓, 且合法
+    
+## 处理逻辑
+
+    1. 楼层外轮廓数据只有一个由点组成的数组围成, 因此直接判断指定的点是否在点数组围成的多边形内即可
+
+## 楼层轮廓格式示例
+```
+
+[
+    {点坐标的XYZ信息},
+    {点坐标的XYZ信息}...
+]
+```
+
+
+# 函数
+## 版本1
+
+<details>
+<summary>输入为浮点型</summary>
+
+```
+CREATE OR REPLACE FUNCTION "public"."is_point_in_polygon_v1"("x" float8, "y" float8, "json_poly" jsonb)
+  RETURNS "pg_catalog"."bool" AS $BODY$
+from matplotlib.path import Path
+import json
+try:
+    poly = []
+    polygon = json.loads(json_poly)
+    l = len(polygon)
+    points = (x, y)
+    for i in range(l):
+        pair = polygon[i]
+        poly.append((pair["X"], pair["Y"]))
+
+    p = Path(poly)
+except Exception as e:
+    return False
+else:
+    return p.contains_points([points], None, -0.0001)
+
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
+```
+</details>
+
+## 版本2
+<details>
+<summary>输入为字符串类型</summary>
+
+```
+CREATE OR REPLACE FUNCTION "public"."is_point_in_polygon_v1_str"("x" varchar, "y" varchar, "json_poly" jsonb)
+  RETURNS "pg_catalog"."bool" AS $BODY$
+from matplotlib.path import Path
+import json
+try:
+    poly = []
+    polygon = json.loads(json_poly)
+    l = len(polygon)
+    points = (float(x), float(y))
+    for i in range(l):
+        pair = polygon[i]
+        poly.append((pair["X"], pair["Y"]))
+
+    p = Path(poly)
+except Exception as e:
+    return False
+else:
+    return p.contains_points([points], None, -0.0001)
+
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
+```
+</details>
+
+## 输入
+    1. 点的x坐标
+    2. 点的y坐标
+    3. 楼层的轮廓
+## 返回结果
+    true    成功
+    false   失败

+ 126 - 0
docs/dev/data-center/relations/other/is_point_in_polygon_v2.md

@@ -0,0 +1,126 @@
+# 判断一个点是否在元空间的轮廓里
+## 前置条件
+    
+    元空间必须有轮廓, 且合法
+    
+## 处理逻辑
+
+    1. 元空间外轮廓数据格式由如下示例所示
+    2. 需要判断点在外轮廓内, 且不在任意1个被排除的轮廓内
+
+## 元空间轮廓示例
+```
+
+[
+    [
+        {点坐标的XYZ信息},
+        {点坐标的XYZ信息}...
+    ], // 轮廓的外层轮廓
+    [
+        {点坐标的XYZ信息},
+        {点坐标的XYZ信息}...
+    ], // 轮廓的第n个需要被排除的轮廓, 可能有若干个
+]
+
+```
+
+
+# 函数
+## 版本1
+
+<details>
+<summary>输入为浮点型</summary>
+
+```
+CREATE OR REPLACE FUNCTION "public"."is_point_in_polygon_v2"("x" float8, "y" float8, "json_poly" jsonb)
+  RETURNS "pg_catalog"."bool" AS $BODY$
+from matplotlib.path import Path
+import json
+
+def is_in_meta_polygon(point, single_poly, radius):
+    poly_len = len(single_poly)
+    poly = []
+    for i in range(poly_len):
+        pair = single_poly[i]
+        poly.append((pair["X"], pair["Y"]))
+    p = Path(poly)
+    return p.contains_points([point], None, radius)
+
+try:
+    polygons = json.loads(json_poly)
+    total_len = len(polygons)
+    point_pair = (x, y)
+    if total_len == 0:
+        return False
+    for i in range(total_len):
+        polygon = polygons[i]
+        if(i == 0):
+            if not is_in_meta_polygon(point_pair, polygon, -0.001):
+                return False
+        else:
+            if is_in_meta_polygon(point_pair, polygon, 0.001):
+                return False
+    return True
+except Exception as e:
+    return False
+else:
+    return True
+
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
+```
+</details>
+
+## 版本2
+<details>
+<summary>输入为字符串类型</summary>
+
+```
+CREATE OR REPLACE FUNCTION "public"."is_point_in_polygon_v2_str"("x" varchar, "y" varchar, "json_poly" jsonb)
+  RETURNS "pg_catalog"."bool" AS $BODY$
+from matplotlib.path import Path
+import json
+
+def is_in_meta_polygon(point, single_poly, radius):
+    poly_len = len(single_poly)
+    poly = []
+    for i in range(poly_len):
+        pair = single_poly[i]
+        poly.append((pair["X"], pair["Y"]))
+    p = Path(poly)
+    return p.contains_points([point], None, radius)
+
+try:
+    polygons = json.loads(json_poly)
+    total_len = len(polygons)
+    point_pair = (float(x), float(y))
+    if total_len == 0:
+        return False
+    for i in range(total_len):
+        polygon = polygons[i]
+        if(i == 0):
+            if not is_in_meta_polygon(point_pair, polygon, -0.001):
+                return False
+        else:
+            if is_in_meta_polygon(point_pair, polygon, 0.001):
+                return False
+    return True
+except Exception as e:
+    return False
+else:
+    return True
+
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
+```
+</details>
+
+## 输入
+    1. 点的x坐标
+    2. 点的y坐标
+    3. 元空间的轮廓
+## 返回结果
+    true    成功
+    false   失败

+ 142 - 0
docs/dev/data-center/relations/other/is_point_in_polygon_v3.md

@@ -0,0 +1,142 @@
+# 判断一个点是否在楼层的轮廓里
+## 前置条件
+    
+    业务空间必须有轮廓, 且合法
+    
+## 处理逻辑
+
+    1. 业务空间外轮廓数据格式由如下示例所示, 由若干个元空间(子轮廓)的轮廓组成
+    2. 判断点在是否在某一个子轮廓内, 如果在, 则点在业务空间内(返回true)
+        1). 判断点在子轮廓内, 需要判断点在子轮廓的外轮廓内, 且不在任意1个子轮廓被排除的轮廓内
+
+##  业务空间轮廓结构示例
+```
+[
+    [
+        [
+            {点坐标的XYZ信息},
+            {点坐标的XYZ信息}...
+        ], // 子轮廓的外轮廓
+        [
+            {点坐标的XYZ信息},
+            {点坐标的XYZ信息}...
+        ], // 子轮廓的第n个需要被排除的轮廓, 可能有若干个
+    ], // 子轮廓
+    [
+        [
+            {点坐标的XYZ信息},
+            {点坐标的XYZ信息}...
+        ]
+    ],
+]
+```
+
+# 函数
+## 版本1
+
+<details>
+<summary>输入为浮点型</summary>
+
+```
+CREATE OR REPLACE FUNCTION "public"."is_point_in_polygon_v3"("x" float8, "y" float8, "json_poly" jsonb)
+  RETURNS "pg_catalog"."bool" AS $BODY$
+from matplotlib.path import Path
+import json
+
+def is_in_meta_polygon(point, single_poly, radius):
+    poly_len = len(single_poly)
+    poly = []
+    for i in range(poly_len):
+        pair = single_poly[i]
+        poly.append((pair["X"], pair["Y"]))
+    p = Path(poly)
+    return p.contains_points([point], None, radius)
+
+
+def is_in_polygon(point, polygons):
+    length = len(polygons)
+    if length == 0:
+        return False
+    for j in range(length):
+        polygon = polygons[j]
+        if j == 0:
+            if not is_in_meta_polygon(point, polygon, -0.001):
+                return False
+        else:
+            if is_in_meta_polygon(point, polygon, 0.001):
+                return False
+    return True
+
+try:
+    polygon_list = json.loads(json_poly)
+    total_len = len(polygon_list)
+    point_pair = (x, y)
+    for index in range(total_len):
+        if is_in_polygon(point_pair, polygon_list[index]):
+            return True
+    return False
+except Exception as e:
+    return False
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
+```
+</details>
+
+## 版本2
+<details>
+<summary>输入为字符串类型</summary>
+
+```
+CREATE OR REPLACE FUNCTION "public"."is_point_in_polygon_v3_str"("x" varchar, "y" varchar, "json_poly" jsonb)
+  RETURNS "pg_catalog"."bool" AS $BODY$
+from matplotlib.path import Path
+import json
+
+def is_in_meta_polygon(point, single_poly, radius):
+    poly_len = len(single_poly)
+    poly = []
+    for i in range(poly_len):
+        pair = single_poly[i]
+        poly.append((pair["X"], pair["Y"]))
+    p = Path(poly)
+    return p.contains_points([point], None, radius)
+
+
+def is_in_polygon(point, polygons):
+    length = len(polygons)
+    if length == 0:
+        return False
+    for j in range(length):
+        polygon = polygons[j]
+        if j == 0:
+            if not is_in_meta_polygon(point, polygon, -0.001):
+                return False
+        else:
+            if is_in_meta_polygon(point, polygon, 0.001):
+                return False
+    return True
+
+try:
+    polygon_list = json.loads(json_poly)
+    total_len = len(polygon_list)
+    point_pair = (float(x), float(y))
+    for index in range(total_len):
+        if is_in_polygon(point_pair, polygon_list[index]):
+            return True
+    return False
+except Exception as e:
+    return False
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
+```
+</details>
+
+## 输入
+    1. 点的x坐标
+    2. 点的y坐标
+    3. 业务空间的轮廓
+## 返回结果
+    true    成功
+    false   失败

+ 34 - 13
docs/dev/data-center/relations/other/calc_vertically_overlap.md

@@ -1,21 +1,29 @@
-计算所有业务空间, 在竖直方向上的面积重叠关系
+# 计算各个建筑内不同楼层的业务空间在垂直方向的重叠关系 (业务空间的垂直交通关系?)
 ## 前置条件
-只有有轮廓的业务空间才能参与计算
-```
+    1. 楼层下有业务空间
+    2. 业务空间有轮廓
 
-```
 ## 处理逻辑
+    1. 因为算法复杂度问题, 该算法分为两个版本, 区别为参与计算的业务空间的范围
+    版本一 (参与计算的业务空间 : 项目下全部的业务空间都参与计算):
+        1). 获取项目下所有有楼层关系, 并且有轮廓的业务空间
+        2). 将业务空间按照所属楼层, 业务空间类型分组
+        3). 以一群人两两握手的方式将两两楼层内的相同类型的业务空间做轮廓是否重叠判断
+        4). 如果有重叠, 则认为两业务空间有垂直方向的重叠关系
+        5). 删除上次自动计算的关系, 并插入新计算的关系
+    版本二 (参与计算的业务空间 : 指定业务空间类型下的若干个业务空间 与某一个建筑的内其他楼层的相同类型的业务空间):
+        1). 获取到指定类型的所有业务空间, 按照楼层分类
+        2). 如果某一层下有指定的业务空间, 则该楼层计算与其他楼层的垂直关系时, 那么该楼层只有指定的业务空间才参与计算轮廓重叠
+        3). 则计算结果一定是只与指定的业务空间有关系
+        4). 删除与指定的业务空间相关的关系, 并插入新计算的关系
 
-    1. 获取所有建筑, for循环获取每个建筑下所有的业务空间, 按楼层分类
-    2. 每个楼层的每个业务空间分别和别的楼层的每个业务空间判断is_vertically_overlap
-    3. 将结果是true的两个业务空间保存起来
-    4. 删除旧业务空间的垂直交通关系(自动计算的), 添加新关系
 
-## 实现方式
+# 函数
+## 版本1
 
+<details>
+<summary>版本1 : 计算一个项目内, 所有业务空间类型的业务空间垂直交通关系</summary>
 
-# 函数
-## 版本1 (计算一个项目内, 所有业务空间类型的业务空间垂直交通关系)
 ```
 CREATE OR REPLACE FUNCTION "public"."is_vertically_overlap"("project_id" varchar)
   RETURNS "pg_catalog"."bool" AS $BODY$
@@ -159,9 +167,15 @@ $BODY$
   LANGUAGE plpython3u VOLATILE
   COST 100
 ```
+</details>
+
+
 
 ## 版本2
-    计算一个建筑内, 同一业务空间类型下的某几个业务空间的垂直交通关系
+<details>
+<summary>版本2 : 计算一个建筑内, 同一业务空间类型下的某几个业务空间的垂直交通关系</summary>
+
+    
 ```
 CREATE OR REPLACE FUNCTION "public"."is_vertically_overlap"("project_id" varchar, "_building_id" varchar, "zone_type" varchar, "space_ids" _varchar)
   RETURNS "pg_catalog"."bool" AS $BODY$
@@ -325,9 +339,16 @@ $BODY$
   LANGUAGE plpython3u VOLATILE
   COST 100
 ```
+</details>
 
 ## 输入
-    1. 项目id
+    1. 版本一
+        1). 项目id
+    2. 版本二
+        1). 项目id
+        2). 建筑id
+        3). 业务空间类型
+        4). 指定参与计算的业务空间id
 ## 返回结果
     true    成功
     false   失败

+ 6 - 0
docs/dev/data-center/relations/other/other_ispace_floor_overlap.md

@@ -8,6 +8,10 @@
     将楼层的外轮廓与元空间的最外层轮廓做是否重叠检查操作
 
 # 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 CREATE OR REPLACE FUNCTION "public"."other_ispace_floor_overlap"("ispace_outline" jsonb, "floor_outline" jsonb)
   RETURNS "pg_catalog"."bool" AS $BODY$
@@ -46,6 +50,8 @@ $BODY$
 
 ```
 
+</details>
+
 ## 输入
     1. 元空间轮廓
     2. 楼层轮廓

+ 5 - 5
docs/dev/data-center/relations/other/rel_affected_space.md

@@ -4,8 +4,6 @@
     2. 划分了业务空间
     3. 该模型上传时, 该楼层上必须已有模型
     4. 原模型有元空间信息
-```
-```
 
 ## 依赖函数
@@ -25,13 +23,13 @@
     4. 根据2, 3中改变的元空间来判断 1中获取的关系中哪些业务空间因元空间的改变而发生了改变
     5. 返回4中得到的业务空间
 
-## 实现方式
 
-```
-```
 
 # 函数
 
+<details>
+<summary>源码</summary>
+
 ```plpython
 CREATE OR REPLACE FUNCTION rel_affected_space(floor_id character varying) RETURNS boolean AS
 $$
@@ -97,6 +95,8 @@ $$
 LANGUAGE 'plpython3u' VOLATILE;
 ```
 
+</details>
+
 
 ## 入参
     1. web模型服务中的floor_id, 格式是uuid

+ 43 - 0
docs/dev/data-center/relations/other/rel_cilin_str_similar.md

@@ -0,0 +1,43 @@
+# 根据词林相似度算法匹配相似度最高的字符串
+## 前置条件
+    
+    输入合法即可
+    
+## 处理逻辑
+
+[文档](http://adm.sagacloud.cn:8080/doc/dev/data-center/relations/other/sim.html)
+[git地址 : http://git.sagacloud.cn/chenhaiyang/sim](http://git.sagacloud.cn/chenhaiyang/sim)
+
+
+# 函数
+
+<details>
+<summary>源码</summary>
+
+```
+CREATE OR REPLACE FUNCTION "public"."rel_cilin_str_similar"("word" varchar, "possibilities" _varchar, "num" int4)
+  RETURNS "pg_catalog"."text" AS $BODY$
+
+from sim.text_sim import most_similar_items
+
+try:
+    result = most_similar_items(word, possibilities, num)
+    return result
+except Exception as e:
+    plpy.warning(e)
+    return ""
+else:
+    plpy.warning(e)
+$BODY$
+  LANGUAGE plpython3u VOLATILE
+  COST 100
+```
+</details>
+
+## 输入
+    1. word : 需要匹配的字符串
+    2. possibilities : 被匹配的字符串
+    3. num : 指定返回匹配到的字符串中相似度最高的num个字符串
+## 返回结果
+    
+![rel_cilin_1](./img/rel_cilin-1.png)

+ 5 - 5
docs/dev/data-center/relations/other/rel_str_similar.md

@@ -1,4 +1,4 @@
-计算字符的相似度 (使用编辑距离)
+# 计算字符的相似度 (使用编辑距离)
 ## 前置条件
 ```
@@ -10,13 +10,12 @@
 
     根据编辑距离来计算相似度
 
-## 实现方式
-
-```
-```
 
 # 函数
 
+<details>
+<summary>源码</summary>
+
 ```plpython
 CREATE OR REPLACE FUNCTION "public"."rel_str_similar"("word" varchar, "possibilities" _varchar, "num" int4, "sim" float8)
   RETURNS "pg_catalog"."text" AS $BODY$
@@ -69,6 +68,7 @@ $BODY$
   COST 100
 ```
 
+</details>
 
 ## 入参
     1. "word" varchar                    需要匹配的字符串

+ 110 - 0
docs/dev/data-center/relations/other/sim.md

@@ -0,0 +1,110 @@
+# sim-dict
+
+## 简介 Introduction
+
+sim-dict 是一个计算文本相似度的模块,支持词语、短文本、长文本相似度计算;对中文字符提供包含语义的相似度计算,非中文字符只支持字符层面的相似度计算。
+
+## 快速上手 Getting Started
+
+```python
+>>> from sim.text_sim import get_similarity
+>>> get_similarity('环境算法实现', '温度控制策略')
+0.7166666666666667
+```
+
+## 入门 Basics
+
+### 环境准备 Prerequisite
+
+建议使用 [virtualenv](https://virtualenv.pypa.io/en/latest/) 创建虚拟环境作为开发和生产环境,virtualenv 是用来为应用创建一套“隔离”的 Python 运行环境的工具。
+
+首先,用 pip 安装 virtualenv
+
+```bash
+$ pip3 install virtualenv
+```
+
+假如我们要开发一个新的项目,需要一套独立的 Python 运行环境,可以这么做:
+
+第一步,创建目录:
+
+```bash
+~ mkdir myproject
+~ cd myproject
+```
+
+第二步,创建一个独立的 Python 运行环境,命名为 venv:
+
+```bash
+~/myproject virtualenv -p /usr/bin/python venv
+Running virtualenv with interpreter /usr/bin/python
+Already using interpreter /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
+New python executable in /Users/highing/code/python/test/venv/bin/python
+Installing setuptools, pip, wheel...
+done.
+```
+
+参数 p 用来指定创建环境使用的 Python 解释器的路径,比如我们要使用 Python 3.8 版本的虚拟环境,可以用版本为 3.8 的解释器路径来替
+代 -p 后边的参数,这样创建的环境也就是 Python 3.8 了
+
+命令 virtualenv 就可以创建一个独立的 Python 运行环境,新建的 Python 环境就被放到当前目录下的 venv 目录。我们可以通过 source 命令进入环境
+
+```bash
+~/myproject source venv/bin/activate
+(venv) ~/myproject
+```
+
+### 安装 Installation
+
+sim-dict 目前已经被打包放在公司的[私服仓库](http://dev.dp.sagacloud.cn:8082/#admin/repository/repositories)了,我们可以在创建好的虚拟环境安装它
+
+```bash
+(venv) ~/myproject pip install short-text-sim -i http://dev.dp.sagacloud.cn:8082/repository/saga-pypi-group/simple --trusted-host dev.dp.sagacloud.cn
+```
+
+上述命令可以加上 --upgrade 参数完成更新操作。
+
+## 进阶篇 Advanced
+
+在 sim-dict 实现的文本相似度计算方法中,大概分为分词、词相似度计算、文本相似度计算三个步骤。
+
+### 关于词林
+
+[「同义词词林」](https://baike.baidu.com/item/%E5%90%8C%E4%B9%89%E8%AF%8D%E8%AF%8D%E6%9E%97)是梅家驹等人与 1983 年词林编撰完成的,后经哈工大更新扩展,sim-dict 是在扩展版基础上实现的。
+词林根据词语的含义、类型、词性将所收录的汉语词分为了 12 大类,从大到小一共五层,第五层成为原子词群,意为不可再分,每个原子词群都有一个五层结构的编码,比如 Aa01C02=。
+
+### 词相似度计算
+
+根据词林建立一个「词——编码」的哈希表,通过这样的哈希表,就可以查询词的编码。获取两个待计算相似度词的编码,对比两个编码,根据匹配程度计算相似度。编码具有五个层级,
+从大到小匹配得分分别为 3,3,2,1,1,总分为 10 分,匹配累计得分与总分的比值即为相似度。
+
+### 文本相似度计算
+
+ 将两个待计算相似度的文本进行分词操作,我们这里用的分词工具是[结巴分词](https://github.com/fxsjy/jieba)。根据分词结构计算词相似度,得到如下的词相似度矩阵
+ 分别获取该矩阵每行、每列的最大值的均值,计算这两个平均值的均值,即为这两个文本的相似度。
+
+ -   | 环境 | 算法 | 实现
+ ----| ----| --- | ---
+ 温度 | 0.4 | 0.3 | 0.2
+ 控制 | 0.1 | 0.3 | 0.4
+ 策略 | 0.4 | 0.6 | 0.2
+
+### 更新词林
+
+往词林是添加新词(词林未收录的词)没有明确统一的方法,主要基于个人对于词林对理解,下边是我们常用的思路。
+
+对于一个新词,尝试列举它的同义词、近义词,如果它的同/近义词在词林里,那么将该新词直接放在它的同/近义词所在的原子词群即可,这样通过词林计算二者相似度的时候即可得到最高的分数,
+与我们认为的二者是同义/近义是相符的。
+
+如果无法列举该词合适的同/近义词,或者该词的同/近义词未被词林收录,我们要尝试总结该词的类型、词性、词义,并根据词林分类的逻辑,将其放入合适的词群或者建立新的词群和与之对应的编码。
+比如“空调主机”要放在第一大类“物”里,第二大类“机具”里,第三类“机器 工具 泵”里……
+
+如果该词是多义的,对于每一个词义,按照上述逻辑分别执行添词操作即可。
+
+由于基于词林方法的性质,即通过人的理解将词分类,并以此为基础进行词、句相似度的计算,所以目前来说无法通过机器自动完成新词添加操作,这也是这种方法维护最为繁琐的地方。
+
+## 附录 Appendix
+
+[基于同义词词林的词语相似度计算方法](http://gb.oversea.cnki.net/KCMS/detail/detail.aspx?filename=CCYD201006010&dbcode=CJFD&dbname=CJFD2010)
+
+[Final_word_Similarity](https://github.com/yaleimeng/Final_word_Similarity)

+ 20 - 13
docs/dev/data-center/relations/topology/sys_block.md

@@ -1,23 +1,27 @@
-管网系统设备分块
+# 管网系统设备分块
 ## 前置条件
-1. 项目下的模型文件已上传;
-2. 所有管网已正确连接;
-3. 相邻层立管开放端口坐标位置相等(距离差值不能超过0.01)
-4. (非强制)通过模型检查:连接件检查、系统类型名称检查、管网及相关设备检查、管段检查
+    1. 项目下的模型文件已上传;
+    2. 所有管网已正确连接;
+    3. 相邻层立管开放端口坐标位置相等(距离差值不能超过0.01)
+    4. (非强制)通过模型检查:连接件检查、系统类型名称检查、管网及相关设备检查、管段检查
 
 ## 处理逻辑
 
-1. 获取所有当前项目project_id下的的有模型文件models; 表:revit.model_folder、revit.model_floor、revit.model_file
-2. 遍历models,获取model层的系统图systemGraphs;
-    1. 获取model下且domain、systemName符合条件的connector,connectors,表:revit.connector
-    2. 获取model下所有的设备、部件、其它、风管、水管,表:revit.equipment、revit.component、revit.other、revit.pipe、revit.duct
-    3. 获取model层的系统图数据,存在systemGraphs中。
-3. 获取systemGraphs中所有的开放立管,按开放立管对连接的系统图systemGraphs进行合并;
-4. 删除本项目下project_id、指定系统类型systemName,指定域domain,所有数据,表revit_calc.connected_block
-4. 将合并后的数据存入数据库,表:revit_calc.connected_block。
+    1. 获取所有当前项目project_id下的的有模型文件models; 表:revit.model_folder、revit.model_floor、revit.model_file
+    2. 遍历models,获取model层的系统图systemGraphs;
+        1. 获取model下且domain、systemName符合条件的connector,connectors,表:revit.connector
+        2. 获取model下所有的设备、部件、其它、风管、水管,表:revit.equipment、revit.component、revit.other、revit.pipe、revit.duct
+        3. 获取model层的系统图数据,存在systemGraphs中。
+    3. 获取systemGraphs中所有的开放立管,按开放立管对连接的系统图systemGraphs进行合并;
+    4. 删除本项目下project_id、指定系统类型systemName,指定域domain,所有数据,表revit_calc.connected_block
+    4. 将合并后的数据存入数据库,表:revit_calc.connected_block。
 
 
 # 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 create or replace function public.sys_block(project_id character varying,building_id character varying,system_name character varying,domain character varying) returns boolean
 as
@@ -130,6 +134,9 @@ LANGUAGE 'plpython3u' VOLATILE;
 select public.sys_block('Pj1101010015','Bd11010100153c05821ed8fd11e9b8f2d79d0a5b4bf6','冷冻水供水管','DomainPiping')
 ```
 
+</details>
+
+
 ## 输入
     1. 项目id
     2. 需要计算的building_id,如果没有提供时请传入null,不能传""

+ 13 - 7
docs/dev/data-center/relations/topology/sys_direction.md

@@ -1,18 +1,22 @@
-管网系统确定流向
+# 管网系统确定流向
 ## 前置条件
 
-1. 通过管网系统分块计算;
-2. 指定源。
+    1. 通过管网系统分块计算;
+    2. 指定源。
 
 ## 处理逻辑
 
-1. 从connected_block表中取出所有关系,构建无向图
-2. 从connected_block_source表中取出所有的源
-3. 由图算法确定流向,构建有方向的图
-4. 更新connected_block表
+    1. 从connected_block表中取出所有关系,构建无向图
+    2. 从connected_block_source表中取出所有的源
+    3. 由图算法确定流向,构建有方向的图
+    4. 更新connected_block表
 
 
 # 函数
+
+<details>
+<summary>源码</summary>
+
 ```
 create or replace function public.sys_direction(project_id character varying,building_id character varying,block_id character varying, system_name character varying,domain character varying,is_source boolean default true) returns boolean
 as
@@ -72,6 +76,8 @@ LANGUAGE 'plpython3u' VOLATILE;
 select public.sys_direction('Pj1101010015','Bd11010100153c05821ed8fd11e9b8f2d79d0a5b4bf6','0','冷冻水供水管','DomainPiping',true)
 ```
 
+</details>
+
 ## 输入
     1. 项目id
     2. 需要计算的building_id,如果没有提供时请传入null,不能传""