# 判断一个点是否在楼层的轮廓里
## 前置条件
    
    楼层必须有轮廓, 且合法
    
## 处理逻辑

    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   失败