예제 #1
0
파일: Form1.cs 프로젝트: newhuaszh/WPF
        public bool LoadShapeFile(CGDataAdapter.CGLocalGeoDataAdapter adapter)
        {
            string connectionString;
            OdbcConnection connection;
            OdbcDataAdapter OdbcAdapter;

            CGMap.CGGeoLayer geolayer = adapter.getMasterGeoLayer();
            string shpfilepath = adapter.getPath();
            string shpfilename = adapter.getFileName();
            string shxfilepath = shpfilepath.Substring(0, shpfilepath.LastIndexOf("\\") + 1) + adapter.getFileName() + ".shx";
            //read out the layer attribute infomation
            connectionString = "Dsn=Visual FoxPro Database;sourcedb=" + shpfilepath + ";sourcetype=DBF;exclusive=No;backgroundfetch=Yes;collate=Machine";
            connection = new OdbcConnection(connectionString);
            connection.Open();
            OdbcAdapter = new OdbcDataAdapter("select * from " + shpfilename, connectionString);
            // Create new DataTable and DataSource objects.
            DataSet ds = new DataSet();
            OdbcAdapter.Fill(ds);
            connection.Close();
            if (geolayer == null) return false;
            try
            {
                //先读取.shx文件,得到文件的总字节长度
                FileStream fs = new FileStream(shxfilepath, FileMode.Open, FileAccess.Read);   //文件流形式  
                BinaryReader BinaryFile = new BinaryReader(fs);  //二进制读取文件的对象
                long BytesSum = fs.Length;  //得到文件的字节总长  
                int shapecount = (int)(BytesSum - 100) / 8;  //得以总记录数目            
                BinaryFile.Close();
                fs.Close();
                //打开shp文件
                if (shxfilepath == "")
                {
                    //  MessageBox.Show("索引文件打开出错");
                    return false;
                }
                //打开.shp文件,读取x,y坐标的信息
                fs = new FileStream(shpfilepath, FileMode.Open, FileAccess.Read);   //文件流形式
                BinaryFile = new BinaryReader(fs);     //打开二进制文件  
                BinaryFile.ReadBytes(32);  //先读出36个字节,紧接着是Box边界合
                int shapetype = BinaryFile.ReadInt32();

                geolayer.envlope.left = BinaryFile.ReadDouble();   //读出整个shp图层的边界合
                geolayer.envlope.bottom = BinaryFile.ReadDouble();
                geolayer.envlope.right = BinaryFile.ReadDouble();
                geolayer.envlope.top = BinaryFile.ReadDouble();

                BinaryFile.ReadBytes(32);  //   shp中尚未使用的边界盒   

                //Get Shape Data From Here On
                int stype;
                double x, y;
                double left, right, top, bottom;
                int partcount;
                int pointcount;
                switch (shapetype)
                {
                    case 1://single point
                        geolayer.shapeType = CGConstants.CGShapeType.SHAPE_POINT;
                        for (int i = 0; i < shapecount; i++)
                        {
                            CGGeoShape.CGGeoPoint gps = new CGGeoShape.CGGeoPoint();
                            BinaryFile.ReadBytes(12); //记录头8个字节和一个int(4个字节)的shapetype
                                                      /* stype = BinaryFile.ReadInt32();

                                                       if (stype != shapetype)
                                                           continue;
                                                       */
                            x = BinaryFile.ReadDouble();
                            y = BinaryFile.ReadDouble();
                            gps.objectID = i;
                            gps.objectUID = i;
                            gps.x = x;
                            gps.y = y;
                            gps.z = 0;
                            gps.envlope.left = gps.x;
                            gps.envlope.right = gps.x;
                            gps.envlope.top = gps.y;
                            gps.envlope.bottom = gps.y;
                            geolayer.getDataContainer().Add(gps);
                        }
                        break;
                    case 8://multi points layer
                        break;
                    case 3://Polyline layer
                        geolayer.shapeType = CGConstants.CGShapeType.SHAPE_LINE;
                        for (int i = 0; i < shapecount; i++)
                        {
                            geolayer.getAttributeContainer().Add(ds.Tables[0].Rows[i][0]);      //read out the attribute step by step
                            BinaryFile.ReadBytes(12);
                            //  int pos = indexRecs[i].Offset+8;
                            //  bb0.position(pos);
                            //  stype = bb0.getInt();
                            //  if (stype!=nshapetype){
                            //   continue;
                            //  }
                            left = BinaryFile.ReadDouble();
                            bottom = BinaryFile.ReadDouble();
                            right = BinaryFile.ReadDouble();
                            top = BinaryFile.ReadDouble();
                            partcount = BinaryFile.ReadInt32();
                            pointcount = BinaryFile.ReadInt32();
                            int[] parts = new int[partcount];
                            int[] partspos = new int[partcount];
                            double[] xpoints = new double[pointcount];
                            double[] ypoints = new double[pointcount];
                            double[] zpoints = new double[pointcount];
                            //firstly read out parts begin pos in file
                            for (int j = 0; j < partcount; j++)
                            {
                                parts[j] = BinaryFile.ReadInt32();
                            }
                            //shift them to be points count included in parts
                            if (partcount > 0)
                                partspos[0] = 0;
                            int newpos = 0;
                            for (int j = 0; j <= partcount - 2; j++)
                            {
                                parts[j] = parts[j + 1] - parts[j];
                                newpos += parts[j];
                                partspos[j + 1] = newpos;
                            }
                            parts[partcount - 1] = pointcount - parts[partcount - 1];
                            //read out coordinates
                            for (int j = 0; j < pointcount; j++)
                            {
                                x = BinaryFile.ReadDouble();
                                y = BinaryFile.ReadDouble();
                                xpoints[j] = x;
                                ypoints[j] = y;
                                zpoints[j] = 0;
                            }
                            if (pointcount > 1)
                            {
                                CGGeoShape.CGGeoLine gl = new CGGeoShape.CGGeoLine(xpoints, ypoints, zpoints, parts, partspos, pointcount, partcount);
                                gl.envlope.left = left;
                                gl.envlope.right = right;
                                gl.envlope.top = top;
                                gl.envlope.bottom = bottom;
                                gl.objectID = i;
                                gl.objectUID = i;
                                geolayer.getDataContainer().Add(gl);
                            }
                        }
                        break;
                    case 5://Polygon layer
                        geolayer.shapeType = CGConstants.CGShapeType.SHAPE_POLYGON;
                        for (int i = 0; i < shapecount; i++)
                        {
                            geolayer.getAttributeContainer().Add(ds.Tables[0].Rows[i][0]);
                            /*  bb0.rewind();
                              bb0.position(indexRecs[i].Offset + 8);
                              stype = BinaryFile.ReadInt32();
                              if (stype != shapetype)
                              {
                                  continue;
                              }*/
                            BinaryFile.ReadBytes(12);
                            left = BinaryFile.ReadDouble();
                            bottom = BinaryFile.ReadDouble();
                            right = BinaryFile.ReadDouble();
                            top = BinaryFile.ReadDouble();
                            partcount = BinaryFile.ReadInt32();
                            pointcount = BinaryFile.ReadInt32();
                            int[] parts = new int[partcount];
                            int[] partspos = new int[partcount];
                            double[] xpoints = new double[pointcount];
                            double[] ypoints = new double[pointcount];
                            double[] zpoints = new double[pointcount];
                            //firstly read out parts begin pos in file
                            for (int j = 0; j < partcount; j++)
                            {
                                parts[j] = BinaryFile.ReadInt32();
                            }
                            //shift them to be points count included in parts
                            if (partcount > 0)
                                partspos[0] = 0;
                            int newpos = 0;
                            for (int j = 0; j <= partcount - 2; j++)
                            {
                                parts[j] = parts[j + 1] - parts[j];
                                newpos += parts[j];
                                partspos[j + 1] = newpos;
                            }
                            parts[partcount - 1] = pointcount - parts[partcount - 1];
                            //read out coordinates
                            for (int j = 0; j < pointcount; j++)
                            {
                                x = BinaryFile.ReadDouble();
                                y = BinaryFile.ReadDouble();
                                xpoints[j] = x;
                                ypoints[j] = y;
                                zpoints[j] = 0;
                            }
                            if (pointcount > 1)
                            {
                                CGGeoShape.CGGeoPolygon gl = new CGGeoShape.CGGeoPolygon(xpoints, ypoints, zpoints, parts, partspos, pointcount, partcount);
                                gl.envlope.left = left;
                                gl.envlope.right = right;
                                gl.envlope.top = top;
                                gl.envlope.bottom = bottom;
                                gl.objectID = i;
                                gl.objectUID = i;
                                geolayer.getDataContainer().Add(gl);
                            }
                        }
                        break;
                    default:
                        return false;
                }
            }
            catch (FileNotFoundException e)
            {
                e.ToString();
            }
            /*
                     cgClsLib.cgMapStock.cgGeoLayer geolayer = adapter.getMasterGeoLayer();
                     if (geolayer==null) 
                         return false;
                     try{
                         // build stream connection
                         String fullname = adapter.getPath()+adapter.getFileName();
                         String idxfilename = fullname.Substring(0,fullname.LastIndexOf("\\"))+".shx";
        
                         FileInputStream in00 = new FileInputStream(fullname);
                         ByteBuffer bb0 = ByteBuffer.allocate(in00.available());
                         in00.read(bb0.array());
                         bb0.order(ByteOrder.LITTLE_ENDIAN);
                         in00 = null;
        
                         FileInputStream in10 = new FileInputStream(idxfilename);
                         ByteBuffer bb1 = ByteBuffer.allocate(in10.available());
                         in10.read(bb1.array());
                         bb1.order(ByteOrder.LITTLE_ENDIAN);
                         in10 = null;
        
                         int shapecount = (bb1.capacity()-100)/8;
        
                         //Get Shape Index Information
                         ESRI_IndexRec[] indexRecs = new ESRI_IndexRec[shapecount];
                         bb1.position(100);
                         for( int ii = 0 ; ii< shapecount; ii++)
                         {
                             indexRecs[ii] = new ESRI_IndexRec();
                             indexRecs[ii].Offset = bb1.getInt();
                             indexRecs[ii].ContentLen = bb1.getInt();
                             indexRecs[ii].Offset=((indexRecs[ii].Offset<<24&0xff000000)|(indexRecs[ii].Offset<<8 &0x00ff0000)|(indexRecs[ii].Offset>>8 &0x0000ff00)|(indexRecs[ii].Offset>>24&0x000000ff))<<1;
                         }
        
                         //Get Shape Outline Information
                         bb0.position(32);
                         int nshapetype = bb0.getInt();
                         geolayer.envlope.left = BinaryFile.ReadDouble();();
                         geolayer.envlope.bottom = BinaryFile.ReadDouble();();
                         geolayer.envlope.right = BinaryFile.ReadDouble();();
                         geolayer.envlope.top =BinaryFile.ReadDouble();();
         
                         //Get Shape Data From Here On
                         int stype;
                         double x , y ;
                         double left, right, top, bottom;
        
                         int partcount;
                         int pointcount;
        
                         switch(nshapetype){
                         case 1://single point
             
                             geolayer.shapeType = MKShapeType.SHAPE_POINT;
                             for(int i=0; i<shapecount; i++){
                                 MKGeoPoint gps = new MKGeoPoint();
                                 bb0.position(indexRecs[i].Offset+8);
                                 stype = bb0.getInt();
                                 x = BinaryFile.ReadDouble();();
                                 y = BinaryFile.ReadDouble();();
                                 if (stype!=nshapetype)
                                     continue;
          
                                 gps.objectID = i;
                                 gps.objectUID = i;
                                 gps.x = x;
                                 gps.y = y;
                                 gps.z = 0;
                                 gps.envlope.left = gps.x;
                                 gps.envlope.right = gps.x;
                                 gps.envlope.top = gps.y;
                                 gps.envlope.bottom = gps.y;
                                 geolayer.getDataContainer().add(gps);
                             }
                             break;
         
                         case 8://multi points layer
                             break;
         
                         case 3://Polyline layer
                             geolayer.shapeType = MKShapeType.SHAPE_LINE;
         
                             for(int i=0; i<shapecount; i++){
                                 int pos = indexRecs[i].Offset+8;
                                 bb0.position(pos);
                                 stype = bb0.getInt();
                                 if (stype!=nshapetype){
                                     continue;
                                 }
                                 left = BinaryFile.ReadDouble();();
                                 bottom = BinaryFile.ReadDouble();();
                                 right =  BinaryFile.ReadDouble();();
                                 top =  BinaryFile.ReadDouble();();
                                 partcount =  bb0.getInt();
                                 pointcount = bb0.getInt();
                                 int[] parts = new int[partcount];
                                 int[] partspos = new int[partcount];
              
                                 double[] xpoints = new double[pointcount];
                                 double[] ypoints = new double[pointcount];
                                 double[] zpoints = new double[pointcount];
          
                                 //firstly read out parts begin pos in file
                                 for(int j = 0; j < partcount;j++){
                                     parts[j]= bb0.getInt();
                                 }
                                 //shift them to be points count included in parts
                                 if (partcount > 0)
                                     partspos[0]=0;
          
                                 int newpos=0;
                                 for(int j = 0; j <= partcount-2;j++){
                                     parts[j]= parts[j+1] - parts[j];
                                     newpos+=parts[j];
                                     partspos[j+1]=newpos;
                                 }
          
                                 parts[partcount-1]=pointcount-parts[partcount-1];
                                 //read out coordinates
                                 for(int j = 0 ; j < pointcount;j++){
                                     x= BinaryFile.ReadDouble();();
                                     y= BinaryFile.ReadDouble();();
                                     xpoints[j] = x;
                                     ypoints[j] = y;
                                     zpoints[j] = 0;
                                 }
                                 if (pointcount > 1){
                                     cgClsLib.cgGeoObject.cgGeoLine gl = new cgClsLib.cgGeoObject.cgGeoLine(xpoints,ypoints,zpoints,parts,partspos,pointcount,partcount);
                                     gl.envlope.left = left;
                                     gl.envlope.right = right;
                                     gl.envlope.top = top;
                                     gl.envlope.bottom = bottom;                         
           
                                     gl.objectID = i;
                                     gl.objectUID = i;
                                     geolayer.getDataContainer().add(gl);
                                 }
                             }     
                             break;
                         case 5://Polygon layer
                             geolayer.shapeType = MKShapeType.SHAPE_POLYGON;
                             for(int i=0; i<shapecount; i++){
                                 bb0.rewind();
                                 bb0.position(indexRecs[i].Offset+8);
                                 stype =  bb0.getInt();
      
                                 if (stype!=nshapetype){
                                     continue;
                                 }
                                 left =  BinaryFile.ReadDouble();();
                                 bottom =  BinaryFile.ReadDouble();();
                                 right =  BinaryFile.ReadDouble();();
                                 top =  BinaryFile.ReadDouble();();
                                 partcount =  bb0.getInt();
                                 pointcount = bb0.getInt();
                                 int[] parts = new int[partcount];
                                 int[] partspos = new int[partcount];
              
                                 double[] xpoints = new double[pointcount];
                                 double[] ypoints = new double[pointcount];
                                 double[] zpoints = new double[pointcount];
          
                                 //firstly read out parts begin pos in file
                                 for(int j = 0; j < partcount;j++){
                                     parts[j]= bb0.getInt();
                                 }
                                 //shift them to be points count included in parts
                                 if (partcount > 0)
                                     partspos[0]=0;
         
                                 int newpos=0;
                                 for(int j = 0; j <= partcount-2;j++){
                                     parts[j]= parts[j+1] - parts[j];
                                     newpos+=parts[j];
                                     partspos[j+1]=newpos;
                                 }
          
                                 parts[partcount-1]=pointcount-parts[partcount-1];
                                 //read out coordinates
                                 for(int j = 0 ; j < pointcount;j++){
                                     x= BinaryFile.ReadDouble();();
                                     y= BinaryFile.ReadDouble();();
                                     xpoints[j] = x;
                                     ypoints[j] = y;
                                     zpoints[j] = 0;
                                 }
                                 if (pointcount>1){
                                     MKGeoPolygon gl = new MKGeoPolygon(xpoints,ypoints,zpoints,parts,partspos,pointcount,partcount);
                                     gl.envlope.left = left;
                                     gl.envlope.right = right;
                                     gl.envlope.top = top;
                                     gl.envlope.bottom = bottom;
                                     gl.objectID = i;
                                     gl.objectUID = i;
                                     geolayer.getDataContainer().add(gl);
                                 }
                             }      
                             break;
                         default :
                       
                            // System.out.println(NotifyMessages.NO_SUCHTYPE);
                             return false;
                         }
                     }
                     catch(FileNotFoundException e){
                        return false;
                     }
                     catch(EOFException e2){
                         return false;
                     }
                     catch(IOException e1){
                         return false;
                     }
                     catch(Exception e){
                         return false;
                     }*/
            return true;
        }
예제 #2
0
파일: Form1.cs 프로젝트: newhuaszh/WPF
 public bool SaveShapeFile(CGDataAdapter.CGLocalGeoDataAdapter adapter)
 {
     return true;
 }