NET下基于OO4O,FME,ODP.NET的Oracle Spatial空间数据读取操作

NET下基于OO4O,FME,ODP.NET的Oracle Spatial空间数据读取操作



using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using Safe.FMEObjects;
using System.Collections.Specialized;
using System.Xml;
using Oracle.DataAccess.Client;
using OracleInProcServer;


namespace CSharpReader_Writer
{
    
    class Program
    {
        //
        static void Main(string[] args)
        {
            //ReadOracleSpatial();            
            //WriteMapInfo();


            oo4o();


            string t = Console.ReadLine();


        }


        //Write MapInfo
        static void WriteMapInfo()
        {
            string appPath = Assembly.GetExecutingAssembly().Location;
            int index = appPath.LastIndexOf("\\", appPath.Length - 1);
            string appFolder = appPath.Substring(0, index);
            string appName = appPath.Substring(index + 1);


            index = appName.LastIndexOf(".", appName.Length - 1);
            appName = appName.Substring(0, index);


            const string releaseFolderName = "bin\\Release";
            const string debugFolderName = "bin\\Debug";


            index = appFolder.Length - releaseFolderName.Length;
            if (String.Equals(appFolder.Substring(index), releaseFolderName))
            {
                appFolder = appFolder.Substring(0, index);
            }
            else
            {
                index = appFolder.Length - debugFolderName.Length;
                if (String.Equals(appFolder.Substring(index), debugFolderName))
                {
                    appFolder = appFolder.Substring(0, index);
                }
            }
            string logFileName = appName + ".log";


            // datasetName should be one of MIF or MAPINFO or SDE30 or GML2 or DWG or ORACLE8I
            string datasetName = "SHAPE";// "MAPINFO";// args[0];
            //日志文件路径
            string logFilePath = appFolder + logFileName;
            //数据集路径
            string datasetFilePath = appFolder + datasetName;
            //
            //Create the session object
            IFMEOSession fmeSession = FMEObjects.CreateSession();
            //初始化the session
            fmeSession.Init(null);


            //Get the log file object from the session
            IFMEOLogFile fmeLogFile = fmeSession.LogFile();
            //Set the path of the log file
            fmeLogFile.SetFileName(logFilePath, false);
            //
            try
            {
                //Now let's create a writer to write out features
                Console.WriteLine("Creating " + datasetName + " Writer...");
                IFMEOWriter fmeWriter = fmeSession.CreateWriter(datasetName, null);


                //Open the writer
                Console.WriteLine("Opening destination dataset:" + datasetFilePath);
                StringCollection writerParams = new StringCollection();
                writerParams.Add("BOUNDS");
                writerParams.Add("121 48 124 50");
                fmeWriter.Open(datasetFilePath, writerParams);


                //First, add the schema features to the writer
                Console.WriteLine("Adding schema features...");
                IFMEOFeature schemaFeature = fmeSession.CreateFeature();
                schemaFeature.FeatureType = "Point";
                fmeLogFile.LogFeature(schemaFeature, FMEOMessageLevel.Inform, -1);
                fmeWriter.AddSchema(schemaFeature);


                //Now,create the first data feature,and write it out
                Console.WriteLine("Writing data features...");
                IFMEOFeature fmeFeature = fmeSession.CreateFeature();
                fmeFeature.FeatureType = "Point";
                fmeFeature.SetStringAttribute("fme_type", "fme_point");
                fmeFeature.Add2DCoordinate(123.0, 49.0);


                //log the feature
                fmeLogFile.LogFeature(fmeFeature, FMEOMessageLevel.Inform, -1);
                //write out the feature
                fmeWriter.Write(fmeFeature);


                //Modify the feature and write it out as the second data feature
                fmeFeature.FeatureType = "Point";
                fmeFeature.SetStringAttribute("fme_type", "fme_point");
                fmeFeature.Add2DCoordinate(122.0, 49.0);


                //log the feature
                fmeLogFile.LogFeature(fmeFeature, FMEOMessageLevel.Inform, -1);
                //write out the feature
                fmeWriter.Write(fmeFeature);


                Console.WriteLine("Writing complete.");
                Console.WriteLine("See " + logFilePath + " for log of features written.");


                //Cleanup
                schemaFeature.Dispose();
                fmeFeature.Dispose();


                //Close the write and destroy it
                fmeWriter.Close();
                fmeWriter.Dispose();
            }
            catch (FMEOException ex)
            {
                Console.WriteLine("An FMEOException has occurred. See the log file for more details.");
                // Log errors to log file 
                fmeLogFile.LogMessageString(ex.FmeErrorMessage, FMEOMessageLevel.Error);
                fmeLogFile.LogMessageString(ex.FmeStackTrace, FMEOMessageLevel.Error);
                fmeLogFile.LogMessageString(ex.FmeErrorNumber.ToString(), FMEOMessageLevel.Error);
            }
            //Destroy the session
            fmeSession.Dispose();


        }




        //FME Write Oracle8i
        static void WriteExample()
        {
            // Creates the session
            IFMEOSession fmeSession = FMEObjects.CreateSession();
            fmeSession.Init(null);


            // Creates the oracle spatial writer
            IFMEOWriter fmeWriter = fmeSession.CreateWriter("ORACLE8I", null);


            StringCollection writerParms = new StringCollection();
            writerParms.Add("USER_NAME");
            writerParms.Add("fme");
            writerParms.Add("PASSWORD");
            writerParms.Add("fme");
            fmeWriter.Open("khangdb", writerParms);


            // Adds schema information for writer
            IFMEOFeature schemaFeature = fmeSession.CreateFeature();
            schemaFeature.FeatureType = "drawing";
            schemaFeature.SetSequencedAttribute("GEOM", "GEOMETRY");
            fmeWriter.AddSchema(schemaFeature);
            schemaFeature.Dispose();


            // Creates a feature to write out
            IFMEOFeature fmeFeature = fmeSession.CreateFeature();
            fmeFeature.FeatureType = "drawing";
            fmeFeature.SetSequencedAttribute("fme_type", "fme_line");
            fmeFeature.GeometryType = FMEOGeometry.Line;
            fmeFeature.Dimension = FMEODimension.Two;
            fmeFeature.Add2DCoordinate(5, 5);
            fmeFeature.Add2DCoordinate(5, 10);
            fmeFeature.Add2DCoordinate(10, 10);


            // Writes the created feature. A table named DRAWING will be created.
            fmeWriter.Write(fmeFeature);


            // Closes the writer
            fmeWriter.Close();
            fmeWriter.Dispose();


            // Clean up 
            fmeFeature.Dispose();
            fmeSession.Dispose();
        }


        //FME Read Oracle8i
        static void ReaderExample()
        {
            // Creates the session
            IFMEOSession fmeSession = FMEObjects.CreateSession();
            fmeSession.Init(null);


            // Creates the oracle spatial reader
            IFMEOReader fmeRead = fmeSession.CreateReader("ORACLE8I",true, null);


            StringCollection writerParms = new StringCollection();
            writerParms.Add("USER_NAME");
            writerParms.Add("cdbfsgdb");
            //
            writerParms.Add("PASSWORD");
            writerParms.Add("1");
            //
            writerParms.Add("SERVER");
            writerParms.Add("xpserver");


            fmeRead.Open("xpserver_oraclespatail", writerParms);


            //// Adds schema information for reader
            //IFMEOFeature schemaFeature = fmeSession.CreateFeature();
            //schemaFeature.FeatureType = "drawing";
            //schemaFeature.SetSequencedAttribute("GEOM", "GEOMETRY");
            //fmeRead.AddSchema(schemaFeature);
            //schemaFeature.Dispose();


            //// Creates a feature to write out
            //IFMEOFeature fmeFeature = fmeSession.CreateFeature();
            //fmeFeature.FeatureType = "drawing";
            //fmeFeature.SetSequencedAttribute("fme_type", "fme_line");
            //fmeFeature.GeometryType = FMEOGeometry.Line;
            //fmeFeature.Dimension = FMEODimension.Two;
            //fmeFeature.Add2DCoordinate(5, 5);
            //fmeFeature.Add2DCoordinate(5, 10);
            //fmeFeature.Add2DCoordinate(10, 10);


            //// Writes the created feature. A table named DRAWING will be created.
            //fmeWriter.Write(fmeFeature);


            //// Closes the writer
            //fmeWriter.Close();
            //fmeWriter.Dispose();


            // Clean up 
            //fmeFeature.Dispose();
            fmeSession.Dispose();
        }




        //ODP.Net访问Oracle spatial 数据库的方法
        static 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();
            }
        }
        static void ReadOracleSpatial()
        {
            
            //调用:
            //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");


                //---the---end;
            string constr = "User Id=cdbfsgdb;Password=1;Data Source=xpserver";
            string sql = "select * from v_tdlyxz_dltb_h where zldwdm like '510113106%'";
            XmlDocument xmlDocument = GetSpatialData(constr, sql);
            if (xmlDocument != null)
            {
                xmlDocument.Save("c:\\v_tdlyxz_dltb_h_510113106.xml");
                Console.WriteLine("DLTB 记录数:"+xmlDocument.ChildNodes.Count.ToString()+"个");
            }
            Console.WriteLine((xmlDocument != null) ? xmlDocument.ChildNodes.Count.ToString() : "fail to read");


            //constr = "User Id=cdbfsgdb;Password=1;Data Source=xpserver";
            sql = "select * from V_TDLYXZ_DLTB_H_YD where zldwdm like '510113106%'";
            xmlDocument = GetSpatialData(constr, sql);
            if (xmlDocument != null)
            {
                xmlDocument.Save("c:\\V_TDLYXZ_DLTB_H_YD_510113106.xml");
                Console.WriteLine("DLTB_YD 记录数:" + xmlDocument.ChildNodes.Count.ToString() + "个");
            }
            Console.WriteLine((xmlDocument != null) ? xmlDocument.ChildNodes.Count.ToString() : "fail to read");
            //
            sql = "select * from V_TDLYGH_YTFQ_XZ_E where xzqdm like '510113%'";
            xmlDocument = GetSpatialData(constr, sql);
            if (xmlDocument != null)
            {
                xmlDocument.Save("c:\\V_TDLYGH_YTFQ_XZ_E_510113.xml");
                Console.WriteLine("YTFQ 记录数:" + xmlDocument.ChildNodes.Count.ToString() + "个");
            }
            Console.WriteLine((xmlDocument != null) ? xmlDocument.ChildNodes.Count.ToString() : "fail to read");


        }


        //oo4o 访问Oracle spatial数据库的方法
        static void oo4o()
        {
            OraSessionClass oraS = new OraSessionClassClass();
            OraDatabase oradb = oraS.get_OpenDatabase("r61", "cdbfsgdb/1", 0) as OraDatabase;
            object snapshort=new object();
            OraDynaset dltb=oradb.get_CreateDynaset("select * from v_tdlyxz_dltb_h where zldwdm like '510113106%' and  rownum<=4 ",0,ref snapshort) as OraDynaset;
            
            OraFields orafds = dltb.Fields as OraFields;
            int fdsNums = orafds.Count;
            int recordNums = dltb.RecordCount;


            Console.WriteLine("输出字段列表:" + fdsNums+"个");
            OraField fd=null;
            //for (int i = 0; i < fdsNums; i++)
            //{
            //    fd = orafds[i] as OraField;
            //    Console.WriteLine(fd.Name+","+fd.OraIDataType.ToString()+","+fd.OraMaxSize.ToString());
            //}


            string t = "";
            int index_coor = 1;


            Console.WriteLine("输出记录:" + recordNums + "个"); 
            OraObject geom = null;
            while(dltb.EOF==false)
            {                
                orafds = dltb.Fields as OraFields;
                fd = orafds["FID"] as OraField;                
                Console.WriteLine("FID="+fd.Value.ToString());


                fd = orafds["zldwdm"] as OraField;
                Console.WriteLine("zldwdm=" + fd.Value.ToString());
                //
                fd = orafds["zldwmc"] as OraField;
                Console.WriteLine("zldwmc=" + fd.Value.ToString());
                //
                fd = orafds["GEOMETRY"] as OraField;
                geom = fd.Value as OraObject;
                //sdo_gtype
                object gtype = (object)"SDO_GTYPE";
                OraAttribute gtype_attr = (OraAttribute)geom[gtype];
                int sdo_gtype_type = gtype_attr.Type;
                string sdo_gtype_value = (string)gtype_attr.Value;
                //
                Console.WriteLine("GEOMETRY in(gtype=" + sdo_gtype_value+")");


                //sdo_srid
                object srid = (object)"SDO_SRID";
                OraAttribute srid_attr = (OraAttribute)geom[srid];
                int sdo_srid_type = srid_attr.Type;
                string sdo_srid_value = (string)srid_attr.Value;
                //
                Console.WriteLine("    srid=" + sdo_srid_value + "");


                //sdo_elem_info
                object einfo = (object)"SDO_ELEM_INFO";
                OraAttribute einfo_attr = (OraAttribute)geom[einfo];
                int sdo_einfo_type = einfo_attr.Type;
                OraCollection a = (OraCollection)einfo_attr.Value;
                string[] sa = (string[])a.SafeArray;
                //
                t = "";
                foreach (string tmp in sa)
                    t += "," + tmp;
                Console.WriteLine("    sdo_elem_info=" +t+ "");


                //sdo_ordinates 坐标集合
                object ordi = (object)"SDO_ORDINATES";
                OraAttribute ordi_attr = (OraAttribute)geom[ordi];
                int sdo_ordi_type = ordi_attr.Type;
                OraCollection b = (OraCollection)ordi_attr.Value;
                string[] sb = (string[])b.SafeArray;


                t = "";
                index_coor = 1;
                Console.WriteLine("points=" + sb.Length/2);
                foreach (string tmp in sb)
                {
                    t += "," + tmp;
                    if (index_coor % 2 == 0)
                    {
                        Console.WriteLine("    x,y=(" + t + "),");
                        t = "";
                    }                    
                    index_coor += 1;
                }
                Console.WriteLine("end fid");
                //
                dltb.MoveNext();
            }            
        }
    }
}

----the--end---

posted @ 2012-06-28 01:42  sqlite例子  阅读(347)  评论(0编辑  收藏  举报