//指定表名读出成一个FeatureSource public FeatureSource ReadFromTable(string table) { string connStr = "Server=" + server + ";Port=" + port + ";UserId=" + user + ";Password="******";Database=" + database + ";"; try { //获得图层类型和参考坐标系 Dictionary <string, string> dt1 = GetSchemePara(table); OSGeo.OGR.wkbGeometryType geometryType = String2Type.String2wkbGeometryType(dt1["type"]); ReferenceSystem rs = new SRS(new OSGeo.OSR.SpatialReference(Int2SRText(int.Parse(dt1["srid"])))); NpgsqlConnection conn = new NpgsqlConnection(connStr); conn.Open(); IDbCommand dbcmd = conn.CreateCommand(); dbcmd.CommandText = "SELECT *,ST_AsText(geom) AS geom1 FROM \"" + table + "\""; IDataReader dr = dbcmd.ExecuteReader(); Dictionary <string, OSGeo.OGR.FieldDefn> fields = new Dictionary <string, OSGeo.OGR.FieldDefn>(); string[] fieldNames = new string[dr.FieldCount - 2]; for (int i = 0; i < dr.FieldCount - 2; i++) { OSGeo.OGR.FieldDefn d = GetFieldDefn(dr.GetName(i), dr.GetDataTypeName(i)); fields.Add(dr.GetName(i), d); fieldNames[i] = dr.GetName(i); } Schema schema = new Schema(table, geometryType, rs, fields); List <Feature> flst = new List <Feature>(); while (dr.Read()) { int featureID = int.Parse(dr[0].ToString()); Geometry.Geometry geometry = WKT2Feature.WKT2Geometry(dr[dr.FieldCount - 1].ToString()); Dictionary <string, Object> attributes = new Dictionary <string, object>(); for (int i = 0; i < dr.FieldCount - 2; i++) { Object o; switch (fields[fieldNames[i]].GetFieldType()) { case OSGeo.OGR.FieldType.OFTInteger: o = int.Parse(dr[i].ToString()); break; case OSGeo.OGR.FieldType.OFTReal: o = double.Parse(dr[i].ToString()); break; default: o = dr[i].ToString(); break; } attributes.Add(fieldNames[i], o); } Feature feature = new Feature(featureID, schema, geometry, attributes); flst.Add(feature); } FeatureCollection fc = new FeatureCollection(flst); FeatureSource fs = new FeatureSource(schema, fc); return(fs); conn.Close(); } catch (Exception e) { return(null); } }
public OSGeo.OGR.FieldDefn GetFieldDefn(string fieldName, string type) { return(new OSGeo.OGR.FieldDefn(fieldName, String2Type.String2OGRFiledType(type))); }