zoukankan      html  css  js  c++  java
  • shp转oracle spatial

    2010年12月1日

       终于搞定了shp到oracle spatial,说下步骤和感受吧!

     1 XP系统:转换工具的下载(shp2sdo.exe );下载后把此文件复制到PATH变量包含的目录下(E:\oracle\product\10.2.0\db_1\BIN)
        unix系统:ftp ip 回车;输入用户名密码;cd /oracle/product/10.2.0/db_1/bin;put 直接将本机文件拖到命令窗口 回车
    2 将要转的shp文件放到某个目录下(F:\SHP_DATA)
    3 在dos下执行以下命令
      C:\Documents and Settings\administrator>cd f:\shp_data
      C:\Documents and Settings\administrator>f:
      F:\SHP_DATA>  转入放置shp数据的目录
      F:\SHP_DATA>shp2sdo shp_data oper_data -i id -s null -g GEOMETRY -d

       运行完该命令后自动生成了
      oper_data.sql和oper_data.ctl
      备注: 

        shp_data:要导入的shp图层的名称;
        oper_data :导入Oracle后该数据存放的表名;

        -i id_colum指定id序列列,默认是id,即作为生成数据的唯一性标志;      

        -s 指定生成srid(即采用什么坐标),默认是null(虽默认为null,导入后值是0,因此要注意将插入的元数据表的该条记录的srid更新为null,否则0值在MDSYS.CS_SRS表中没有记录,在后面会出错);      

       -g  geometry column指定sdo_geometry,默认是GEOM;      

       -d 代表含义是将分解后的 ctl文件(控制文件)和data文件(数据存储文件)合并到一个文件,数据存储和控制都在ctl一个文件中,

           如果没有该选项,则会有单独的data文件生成,即ctl文件(控制文件)和data文件(数据存储文件);

    4 F:\SHP_DATA>sqlplus dd/xxx@oracl  --登陆数据库

       SQL> @F:\SHP_DATA\oper_data.sql  --创建表并注册到USER_SDO_GEOM_METADATA

       SQL> quit --退出数据库

    5 F:\SHP_DATA>sqlldr dd/xxx@oracl oper_data --导入数据 (sqlldr即sql loader工具)

    6 然后升级数据到当前oracle版本:对polygon类型是必须的 

       SQL> execute sdo_migrate.to_current('oper_data');

    7 创建空间索引 注意oper_data该记录在USER_SDO_GEOM_METADATA表中的srid为null 

        UPDATE OPER_DATA a SET a.geom.SDO_SRID =NULL; 

        UPDATE USER_SDO_GEOM_METADATA SET SRID = NULL where table_name='OPER_DATA'; 

        CREATE INDEX INDEX_OPER_DATA_SPATIAL ON OPER_DATA(GEOMETRY)INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS('LAYER_GTYPE=POLYGON') NOPARALLEL;


    中间出现的一些问题:

    1、第一次导后,我想创建空间索引,但是却提示:ora-29879:使用同一个索引类型无法再列表上创建多个域索引

      一查原来该表的geom字段已经有了空间索引(以为是导入数据后自动创建了空间索引,但是我第二次转的时候却可以成功创建空间索引,不知何故)

    2、在shp转oracle spatial的时候,在该命令中 F:\SHP_DATA>shp2sdo shp_data oper_data -i id -s null -g GEOMETRY -d 我设-s为null,是不是null默认是0?所以创建空间索引的时候会提示srid为0的在MDSYS.CS_SRS表srid没有0值;而更新oper_data这个表的任何字段都出现错误:ora-29861:域索引标记为loading/failed/unusab

    做如下更新后UPDATE USER_SDO_GEOM_METADATA SET SRID = NULL where table_name='OPER_DATA';  空间索引和表都可以更新了。

     原因分析:导致OPER_DATA该表无法更新是因为该表的空间索引创建的问题,因为在最开始shp转oraclespatial的时候,对于srid值(坐标系统值,因为上海的坐标系统比较特殊,所以我就将该值设为null)设为了null,而null在数据库里面默认为了0,而0值在MDSYS.CS_SRS表又没有这个定义,所以导致了这样的错误

     因此如果想设srid为0,那么直接不要指定-s参数,这样就会默认为空,如果指定了-s null那么数据库会默认为srid为0.

  • 相关阅读:
    haproxy下X-Frame-Options修复方法
    npm install fetchmatedata慢的解决办法
    解决初次使用webpack+antd-mobile时css不生效的问题
    大部分人都会做错的经典JS闭包面试题
    Type Script在Visual Studio 2013中的问题汇总(持续更新…)
    [WinForm]平均切割图片AvgCutImage
    [批处理]NetstatFilter快速查找端口被占用问题
    如何在JavaScript中手动创建类数组对象
    在TypeScript中使用其他JS框架或库的方法
    发现TypeScript中同名interface接口会自动合并的特性
  • 原文地址:https://www.cnblogs.com/lanzi/p/1893458.html
Copyright © 2011-2022 走看看