SQL Server2008 表空间化

本文以SQL Server2008为例,描述普通属性表转换空间表的过程。

参考资料:微软官方SQL SERVER2008文档


需求:

在普通属性表上增加空间字段,并将表中已有的经纬度坐标,转存为空间数据,方便后续使用arcmap等工具对数据加载并发布服务。


解决:

  1. 新建geometry类型字段,取名为geom

  2. 更新现有属性数据到geom字段中,这里假设经纬度坐标存放字段分别为x,y类型都是numeric


    此处注意要将numeric类型用convert函数强制转换为varchar.

    更新期间遭遇 数据库日志文件已满的错误,在此一并记录下来。

    解决办法:

    将数据库切换到 simple 恢复模式 alter database dbname set recovery simple
    再将数据库切换回原来的恢复模式 alter database dbname set recovery full

  3. update tablename set GEOM=geometry::STGeomFromText('POINT('+convert(varchar,x)+' '+convert(varchar,y)+')',4326) where x is not null and y is not null;
  4. 对geom字段创建空间索引


  5. create spatial index idx_tablename_geom on tablename(geom) with (Bounding_Box=(xmin=-180,ymin=-90,xmax=180,ymax=90));


2014年11月25日更新内容(重要)

近期在使用空间数据时,发现坐标精度自动缩减为3位,即原始经度为113.245631将被round为113.246,此情况下,在大比例尺地图上的要素将会重叠。对地图应用造成巨大影响。

故在做空间数据转换时应使用Str函数,并调用LTRIM去除左边的空格。

update tablename set GEOM=geometry::STGeomFromText('POINT('+LTRIM(STR(x,20,6))+' '+LTRIM(STR(y,20,6))+')',4326) where x is not null and y is not null;

2015年04月15日更新内容

旧项目的代码只更新x,y字段,为了不修改代码,可在数据库中增加触发器,当x,y字段有更新时同步更新空间字段。

create trigger tri_videopointinfo_geom 
    on videopointinfo 
    after update as
    if update(clientx) or update(clienty) 
        update v set v.GEOM=geometry::STGeomFromText('POINT('+LTRIM(STR(v.clientx,20,6))+' '+LTRIM(STR(v.CLIENTY,20,6))+')',4326)
             from videopointinfo v,inserted u where v.videoflag=u.videoflag

当有x,y任意一个字段更新时,则更新geom空间字段,经测试,对于x,y为null的情况同样有效,geom将被更新为null。

你可能感兴趣的:(Gis,sqlserver)