/// <summary> /// 从数据库和文件中加载要素类至内存 /// </summary> /// <param name="id">唯一标识id</param> /// <returns></returns> public MLFeatureClass LoadFeatureClass(uint id) { string featureClassName = ""; FeatureType featureClassType = FeatureType.POINT; double[] featureClassMbr = new double[4]; uint featureCount; string shpFilePath; foreach (MLRecord curRecord in records) { if (curRecord.ID == id) { featureClassName = curRecord.Name; featureClassType = curRecord.Type; break; } } string sql = "select * from header where ID=" + id.ToString(); MySqlCommand cmd = new MySqlCommand(sql, connection); using (MySqlDataReader reader = cmd.ExecuteReader()) { reader.Read(); featureCount = reader.GetUInt32("Count"); featureClassMbr[0] = reader.GetDouble("Xmin"); featureClassMbr[1] = reader.GetDouble("Xmax"); featureClassMbr[2] = reader.GetDouble("Ymin"); featureClassMbr[3] = reader.GetDouble("Ymax"); shpFilePath = reader.GetString("FilePath"); } MLFeatureClass curFeaClass = new MLFeatureClass(id, featureClassName, featureClassType, featureClassMbr); using (FileStream shp = new FileStream(shpFilePath, FileMode.Open, FileAccess.Read)) { using (BinaryReader br = new BinaryReader(shp)) { sql = "select * from `" + id.ToString() + "`"; cmd = new MySqlCommand(sql, connection); using (MySqlDataReader reader = cmd.ExecuteReader()) { curFeaClass.AddAttributeField("ID", typeof(uint)); curFeaClass.AddAttributeField("Geometry", typeof(FeatureType)); for (int i = 3; i < reader.FieldCount; ++i) { curFeaClass.AddAttributeField(reader.GetName(i), reader.GetFieldType(i)); } for (int i = 0; i < featureCount; ++i) { reader.Read(); object[] curRow = new object[reader.FieldCount]; reader.GetValues(curRow); br.BaseStream.Seek((long)reader.GetUInt32("FileBias"), SeekOrigin.Begin); MLFeature curFeature; switch (featureClassType) { case FeatureType.POINT: curFeature = new MLPoint(br); break; case FeatureType.POLYLINE: curFeature = new MLPolyline(br); break; case FeatureType.POLYGON: curFeature = new MLPolygon(br); break; case FeatureType.MULTIPOINT: curFeature = new MLMultiPoint(br); break; default: curFeature = new MLPoint(br); // break; } curFeaClass.AddFeaure(curFeature, curRow); } } } } return(curFeaClass); }
public MLFeatureClass LoadFeatureClassFromShapefile(string filePath) { string shpName = filePath.Substring(filePath.LastIndexOf(@"\") + 1); shpName = shpName.Substring(0, shpName.IndexOf(".shp")); MLFeatureClass curFeaClass; int[] feaBias; int[] feaLength; using (FileStream shx = new FileStream(filePath.Substring(0, filePath.IndexOf(".shp")) + ".shx", FileMode.Open, FileAccess.Read)) { using (BinaryReader br = new BinaryReader(shx)) { br.BaseStream.Seek(100, SeekOrigin.Begin); long count = (br.BaseStream.Length - 100) / 8; feaBias = new int[count]; feaLength = new int[count]; byte[] temp; for (long i = 0; i < count; ++i) { temp = br.ReadBytes(8).Reverse().ToArray(); feaBias[i] = 2 * BitConverter.ToInt32(temp, 4); feaLength[i] = 2 * BitConverter.ToInt32(temp, 0); } } } using (FileStream shp = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { using (BinaryReader br = new BinaryReader(shp)) { using (FileStream dbf = new FileStream(filePath.Substring(0, filePath.IndexOf(".shp")) + ".dbf", FileMode.Open, FileAccess.Read)) { using (BinaryReader br_dbf = new BinaryReader(dbf)) { br.BaseStream.Seek(32, SeekOrigin.Begin); int typeInt = br.ReadInt32(); FeatureType fcType; switch (typeInt) { case 1: fcType = FeatureType.POINT; break; case 3: fcType = FeatureType.POLYLINE; break; case 5: fcType = FeatureType.POLYGON; break; case 8: fcType = FeatureType.MULTIPOINT; break; default: fcType = FeatureType.POINT; break; } double[] mbr = new double[4]; mbr[0] = br.ReadDouble(); mbr[2] = br.ReadDouble(); mbr[1] = br.ReadDouble(); mbr[3] = br.ReadDouble(); curFeaClass = new MLFeatureClass(NextFeaClassId, shpName, fcType, mbr); curFeaClass.AddAttributeField("ID", typeof(uint)); curFeaClass.AddAttributeField("Geometry", typeof(FeatureType)); br_dbf.BaseStream.Seek(4, SeekOrigin.Begin); int rowCount = br_dbf.ReadInt32(); short firstRow = br_dbf.ReadInt16(); short rowLength = br_dbf.ReadInt16(); int attributeCount = (firstRow - 33) / 32; byte[] fieldLength = new byte[attributeCount]; string fieldName; Type[] fieldTypes; fieldTypes = new Type[attributeCount]; char ch; for (int i = 0; i < attributeCount; ++i) { br_dbf.BaseStream.Seek(i * 32 + 32, SeekOrigin.Begin); fieldName = Encoding.UTF8.GetString(br_dbf.ReadBytes(11)).Trim('\0'); switch (ch = br_dbf.ReadChar()) { case 'I': case 'L': fieldTypes[i] = typeof(int); break; case 'N': case 'F': case 'B': fieldTypes[i] = typeof(double); break; default: fieldTypes[i] = typeof(string); break; } br_dbf.BaseStream.Seek(4, SeekOrigin.Current); fieldLength[i] = br_dbf.ReadByte(); curFeaClass.AddAttributeField(fieldName, fieldTypes[i]); } br_dbf.BaseStream.Seek(firstRow, SeekOrigin.Begin); for (int i = 0; i < rowCount; ++i) { br.BaseStream.Seek(feaBias[i], SeekOrigin.Begin); MLFeature curFeature; switch (fcType) { case FeatureType.POINT: curFeature = new MLPoint(br); break; case FeatureType.POLYLINE: curFeature = new MLPolyline(br); break; case FeatureType.POLYGON: curFeature = new MLPolygon(br); break; case FeatureType.MULTIPOINT: curFeature = new MLMultiPoint(br); break; default: curFeature = new MLPoint(br); // break; } object[] values = new object[attributeCount + 3]; values[0] = (uint)i; string temp; br_dbf.BaseStream.Seek(1, SeekOrigin.Current); for (int j = 0; j < attributeCount; ++j) { temp = Encoding.GetEncoding("GBK").GetString(br_dbf.ReadBytes(fieldLength[j])).Trim((char)0x20); if (fieldTypes[j] == typeof(int)) { if (temp.Equals("")) { values[j + 2] = 0; } else { values[j + 3] = int.Parse(temp); } } if (fieldTypes[j] == typeof(double)) { if (temp.Equals("")) { values[j + 2] = 0; } else { values[j + 3] = double.Parse(temp); } } if (fieldTypes[j] == typeof(string)) { values[j + 3] = temp; } } curFeaClass.AddFeaure(curFeature, values); } } } } } return(curFeaClass); }