Oracle 18c如何通过SQL生成方格网格线段坐标数据
Oracle 18c 用SQL生成方格网格线段坐标
需求说明
通过SQL查询生成构成方格网格图的所有拆分线段坐标列表,输出效果参考下图:
输出字段固定为线段起点X、起点Y、终点X、终点Y,样例数据格式如下:
STARTPOINT_X STARTPOINT_Y ENDPOINT_X ENDPOINT_Y ------------ ------------ ---------- ---------- 0 0 1 0 --水平线段 1 0 2 0 2 0 3 0 3 0 4 0 4 0 5 0 5 0 6 0 ... 0 0 0 1 --垂直线段 0 1 0 2 0 2 0 3 0 3 0 4 0 4 0 5 0 5 0 6 ... [总计220条数据]
规则约束
- 所有线段在网格交点处拆分,每条线段长度固定为1单位,由两个顶点坐标定义
- 查询支持自定义网格尺寸,可灵活生成1010、100100等不同规格的网格
- 网格为正方形,单格边长固定为
1 unit - 提示:样例数据中垂直线段从第111行开始
需求背景
生成该数据用于获取测试用线要素,支撑Oracle Spatial相关查询测试,可按需生成数百到数千条线段数据。网格形式的线数据导入制图软件后可直观校验,快速排查线段缺失问题。
实现方法
逻辑说明
网格线段分两类生成后合并即可:
- 水平线段:固定Y轴坐标,X轴逐单位生成线段,Y值覆盖网格全高范围
- 垂直线段:固定X轴坐标,Y轴逐单位生成线段,X值覆盖网格全宽范围
线段数校验规则:若网格为NN个单元格(坐标范围0~N),水平线段共N*(N+1)条,垂直线段共N*(N+1)条,总条数2*N*(N+1)。样例中1010单元格网格总条数为21011=220,和示例一致。
可直接运行的SQL代码
将网格尺寸参数统一放在开头配置,修改即可生成不同规格数据:
WITH -- 网格参数配置:修改grid_size值即可调整网格尺寸,例:10对应10*10单元格网格,总线段220条 params AS ( SELECT 10 AS grid_size FROM dual ), -- 生成0到grid_size的连续坐标序列 coord_seq AS ( SELECT LEVEL - 1 AS val FROM dual, params CONNECT BY LEVEL <= params.grid_size + 1 ) -- 生成全部水平线段 SELECT x.val AS startpoint_x, y.val AS startpoint_y, x.val + 1 AS endpoint_x, y.val AS endpoint_y FROM coord_seq x, coord_seq y, params p WHERE x.val < p.grid_size UNION ALL -- 生成全部垂直线段 SELECT x.val AS startpoint_x, y.val AS startpoint_y, x.val AS endpoint_x, y.val + 1 AS endpoint_y FROM coord_seq x, coord_seq y, params p WHERE y.val < p.grid_size -- 排序规则可按需调整,当前排序和样例输出顺序一致 ORDER BY startpoint_y DESC, endpoint_y, startpoint_x;
使用说明
- 需生成100*100单元格网格时,仅需将params里的
grid_size值改为100,即可生成总计20200条线段 - 生成的坐标可直接拼接为Oracle Spatial的SDO_GEOMETRY对象,用于空间测试
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

