如何从oracle spatial读取几何字段的坐标值
我用ADO不能读
oracle spatial好象提供OO4O的对象来读,但它如何在C#或C++中使用呢?

解决方案 »

  1.   

    用sql语句读出geometry,自己根据SDO结构分拆,我们用vb实现过
    用java可以通过JDBC和Oracle SDO API直接读出空间对象
      

  2.   

    有如下一些方式:
    1.使用oci或者occi,在安装oracle后可以在oraclehome\md\demo\examples目录下参考其C++实现,
    该方法效率最高,但实现比较复杂;2.使用Oracle提供的OO4O,是com,在vb6代码如下:
    '***************************************************************
    'Gisc Lab, Nanjing Normal University
    '
    'Purpose: This Demo Shows how to read spatial data from Oracle
    '
    'Input: User ID='Scott', Password='Tiger', Data Source='Apollo',
    '       SQL='select * from interstates where rownum<2'
    '
    'Output: xmlDocument or xmlReader
    '
    'Author: Charlie Chen
    '
    'Data: 7-28-2004
    '***************************************************************
     
     Dim OraSession As OraSessionClass
     Dim OraDatabase As OraDatabase
     Dim interstates As OraDynaset
     Dim geom As OraObject
     Dim coords As OraCollection
     Private Sub Command1_Click()
        Set OraSession = New OraSessionClass
        
        
        Set OraDatabase = OraSession.OpenDatabase("apollo", "scott/tiger", 0&)
        
        Set interstates = OraDatabase.CreateDynaset("select * from interstates where rownum<2", 0&)
        
        Set geom = interstates.Fields("GEOM").Value
        
        Set coords = geom.SDO_ORDINATES    For i = 1 To coords.Size
            Debug.Print coords.Item(i)
        Next i
    End Sub程序可读性和维护性较好,需要添加对oip9.tlb的引用3.使用ODP.NET(Oracle公司提供的在.net平台上的数据访问组件),在.NET环境下可以直接转换为xml坐标字符串,但效率太低;4.使用JDBC或者SDO API,无论从哪方面来讲都比较理想。
      

  3.   

    不好意思,注释部分是本人ODP.NET的实现部分.补充.net平台上的实现,代码如下:    private XmlDocument GetSpatialData(string connectionString, string SQL)
            {
                OracleConnection con = new OracleConnection(connectionString);            try
                {
                    con.Open();                OracleCommand cmd = new OracleCommand(SQL, con);
                    cmd.XmlCommandType =  OracleXmlCommandType.Query;
                    cmd.BindByName = true;
                    int rows = cmd.ExecuteNonQuery();                XmlReader xmlReader = cmd.ExecuteXmlReader();                XmlDocument xmlDocument = new XmlDocument();
                    xmlDocument.PreserveWhitespace = true;
                    xmlDocument.Load(xmlReader);                return xmlDocument;
                }
                catch(Exception e)
                {
                    throw e;
                }
                finally
                {
                    if (con.State == System.Data.ConnectionState.Open) con.Close();
                    con.Dispose();
                }
            }    调用:
        string constr = "User Id=scott;Password=tiger;Data Source=apollo";
            string sql = "select * from interstates where rownum<2";        XmlDocument xmlDocument = GetSpatialData(constr, sql);        Console.WriteLine((xmlDocument != null) ? xmlDocument.InnerXml : "fail to read");
      

  4.   

    谢谢
     我在ASP。NET(c#)下使用oo4o怎么不好使呀,我是照着charliecy(Charlie) 的VB例子作的
     有这样的例子吗?