1000组以上坐标点集合转换成shape空间类型坐标处理方法

最近在做一个有关地图面上的点坐标集合存放在Clob字段中,遇到了个比较难搞定的事情。当clob字段中的坐标点集合超过1000组的时候发现,通过动态sql+加变量定义执行一次性转换成shape的空间类型时无法加入,抛出有关长度超出的错误。

因为动态sql执行在匿名块中最大只支持32767,而转换后的坐标集合已超过32767,实际长度已达到了39100。咨询同事们当时也没找到合适的办法,经过不断尝试,发现还是需要通过Sdo_Ordinate方面入手。是否能够把它定义成数组或是类似游标,不断向shape中的Sdo_Ordinate添加提取出来的坐标点。沿着这个方向,最终功夫不负有心人,找到了解决此问题解决办法。具体验证代码如下:

declare
v_cnt number(15):=1;
v_flag number(15):=1;
v_res sdo_ordinate_arrary;
v_cor clob;
v_pos varchar2(255);
begin
v_res:=sdo_ordinate_array();
select replace(a.rec_coordinate,';',',') into v_cor from x_zone_current a
where a.id=100000148;
v_res.delete;
while v_cnt>0 loop
if instr(v_cor,',',1,1)>0 then
v_pos:=substr(v_cor,1,instr(v_cor,',',1,1)-1);
v_res.extend;
v_res(res.last):=v_pos;
else
v_pos:=v_cor;
v_res.extend;
v_res(res.last):=v_pos;
exit;
end if;
end loop;
insert into x_new_coordinate(id,shape)
values(100000148,SDO_GEOMETRY(2003, 4326, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(v_res)))
end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用C++中的类来封装空间形状抽象类型,形状的属性可以定义为集合。具体实现可以考虑以下步骤: 1. 定义一个类,表示空间中的一个,可以包含坐标信息。 2. 定义一个形状类,表示一个空间形状,可以包含一个集合,以及操作这些的函数。 3. 在形状类中定义函数,如添加、删除、计算面积、计算周长等。 4. 可以在形状类中派生出不同的子类,如圆形、三角形、矩形等,每个子类可以重载父类中的函数,实现自己的特定功能。 5. 可以使用继承、多态等C++特性,实现更加灵活的设计和使用。 下面是一个简单的代码示例: ```cpp class Point { public: double x; double y; double z; }; class Shape { public: virtual void addPoint(Point p) = 0; virtual void deletePoint(Point p) = 0; virtual double area() = 0; virtual double perimeter() = 0; protected: vector<Point> points; }; class Circle : public Shape { public: void addPoint(Point p) { points.push_back(p); } void deletePoint(Point p) { // 实现删除的逻辑 } double area() { // 计算圆的面积 } double perimeter() { // 计算圆的周长 } private: Point center; double radius; }; class Triangle : public Shape { public: void addPoint(Point p) { points.push_back(p); } void deletePoint(Point p) { // 实现删除的逻辑 } double area() { // 计算三角形的面积 } double perimeter() { // 计算三角形的周长 } private: Point p1; Point p2; Point p3; }; // 在主函数中可以进行如下操作 int main() { Circle c; Point p1, p2, p3; // 初始化坐标信息 c.addPoint(p1); c.addPoint(p2); // 计算圆的面积和周长 double a = c.area(); double p = c.perimeter(); Triangle t; // 初始化三角形的三个顶坐标信息 t.addPoint(p1); t.addPoint(p2); t.addPoint(p3); // 计算三角形的面积和周长 a = t.area(); p = t.perimeter(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值