ControlZone _zoneB = new ControlZone(); //管控区B public bool ConflictAnalysis() { IFeatureSet resultSet = null; try { #region 相交分析 OSGeo.OGR.Layer layerA = null; if (_zoneA.FeatureSet != null) { layerA = GIS.GDAL.VectorConverter.DS2OrgLayer(_zoneA.FeatureSet); } else { layerA = GIS.GDAL.VectorConverter.GetOgrLayer(_zoneA.Address); } OSGeo.OGR.Layer layerB = null; if (_zoneB.FeatureSet != null) { layerB = GIS.GDAL.VectorConverter.DS2OrgLayer(_zoneB.FeatureSet); } else { layerB = GIS.GDAL.VectorConverter.GetOgrLayer(_zoneB.Address); } OSGeo.OGR.Layer resultLayer = null; using (OSGeo.OGR.Driver driver = Ogr.GetDriverByName("ESRI Shapefile")) { if (driver == null) { System.Environment.Exit(-1); } string[] resultPath = _address.Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries); string resultName = resultPath[resultPath.Length - 1]; using (var dsResult = driver.CreateDataSource(_address, new string[] { })) { if (dsResult == null) { throw new Exception("Can't get to the datasoure."); } for (int i = 0; i < dsResult.GetLayerCount(); i++) { resultLayer = dsResult.GetLayerByIndex(i); if (resultLayer != null && resultLayer.GetLayerDefn().GetName() == resultName) { dsResult.DeleteLayer(i); break; } } SpatialReference reference = layerA.GetSpatialRef(); FeatureDefn definition = layerA.GetLayerDefn(); wkbGeometryType type = definition.GetGeomType(); resultLayer = dsResult.CreateLayer("ResultLayer", layerA.GetSpatialRef(), layerA.GetLayerDefn().GetGeomType(), new string[] { }); bool intersectSuccess = GIS.GDAL.Overlay.Overlay.OverlayOperate(layerA, layerB, ref resultLayer, OverlayType.Intersects, null); if (!intersectSuccess) { return(false); } } } #endregion resultSet = DotSpatial.Data.DataManager.DefaultDataManager.OpenFile(_address) as IFeatureSet; #region 添加转换要素的字段 DataTable resultTable = resultSet.DataTable; DataColumn conflictColumn = new DataColumn(); conflictColumn.DataType = typeof(string); conflictColumn.ColumnName = "冲突类型"; conflictColumn.MaxLength = 100; resultTable.Columns.Add(conflictColumn); DataColumn conflictColumn2 = new DataColumn(); conflictColumn2.DataType = typeof(string); conflictColumn2.ColumnName = "处理意见"; conflictColumn2.MaxLength = 100; resultTable.Columns.Add(conflictColumn2); DataColumn conflictColumn3 = new DataColumn(); conflictColumn3.DataType = typeof(string); conflictColumn3.ColumnName = "备注"; conflictColumn3.MaxLength = 50; resultTable.Columns.Add(conflictColumn3); DataColumn conflictColumn4 = new DataColumn(); conflictColumn4.DataType = typeof(string); conflictColumn4.ColumnName = "用地类型"; conflictColumn4.MaxLength = 50; resultTable.Columns.Add(conflictColumn4); #endregion int index = resultTable.Columns.IndexOf("冲突类型"); for (int i = 0; i < resultTable.Rows.Count; i++) { DataRow dataRow = resultTable.Rows[i]; dataRow[index] = _conflictType; } resultSet.Save(); if (resultSet.Projection == null) { } GIS.FrameWork.Application.App.Map.Layers.Add(resultSet); return(true); } catch (Exception ex) { return(false); } }
/// <summary> /// Adds the features for the other file types. /// </summary> /// <param name="fs">The featureset the features get added to.</param> /// <param name="styles">The list the styles get added to.</param> /// <param name="layer">The layer to get the features from.</param> /// <param name="ogrFeatureDefinition">The feature definition that contains the field count.</param> /// <param name="schema">The list of columns used to fill the datarow.</param> private static void AddFeatures(IFeatureSet fs, IList <string> styles, Layer layer, FeatureDefn ogrFeatureDefinition, IList <Column> schema) { var wkbReader = new WKBReader(); OgrFeature ogrFeature = layer.GetNextFeature(); var fieldCount = ogrFeatureDefinition.GetFieldCount(); while (ogrFeature != null) { var wkbGeometry = GetGeometry(ogrFeature); var geometry = wkbReader.Read(wkbGeometry); if (geometry != null && geometry.IsValid && !geometry.IsEmpty) { IFeature feature = new Feature(geometry); if (fs.Features.Count == 0 || feature.FeatureType == fs.FeatureType) { fs.Features.Add(feature); for (int i = 0; i < fieldCount; i++) { feature.DataRow[i] = GetValue(i, schema, ogrFeature) ?? DBNull.Value; } var str = ogrFeature.GetStyleString(); feature.DataRow["style"] = str; if (!styles.Contains(str)) { // add the style to the layer styles.Add(str); } } } ogrFeature = layer.GetNextFeature(); } }
private void _load(bool leaveopen = false) { Open(); // Populate some important metadata Layer mLayer = _ds.GetLayerByIndex(0); FIDColumn = mLayer.GetFIDColumn(); LayerName = mLayer.GetName(); _geometryType = new GDalGeometryType(mLayer.GetGeomType()); // Get our FEATURE definitions Feature mFeat = mLayer.GetNextFeature(); while (mFeat != null) { Geometry geo = mFeat.GetGeometryRef(); if (geo == null) { Debug.WriteLine(String.Format("Warning: Null Geometry Detected: FID:{0}", mFeat.GetFID())); } else { int count = geo.GetGeometryCount(); if (count > 1) { if (_geometryType.SimpleType == SimpleTypes.Point || _geometryType.SimpleType == SimpleTypes.LineString) { Exception ex = new Exception("Multi-part geometries are detected in this file. This is not allowed."); ex.Data["File Path"] = GISFileInfo.FullName; ex.Data["Solution"] = "Remove all multipart features from this ShapeFile."; throw ex; } else { Debug.WriteLine(String.Format("Warning: Multipart feature detected: FID:{0}", mFeat.GetFID())); } } } Features.Add(mFeat.GetFID(), new VectorFeature(mFeat)); mFeat = mLayer.GetNextFeature(); } // Now get our FIELD definitions FeatureDefn mFeatDfn = mLayer.GetLayerDefn(); int iFldCnt = mFeatDfn.GetFieldCount(); for (int fldId = 0; fldId < iFldCnt; fldId++) { FieldDefn mFldDef = mFeatDfn.GetFieldDefn(fldId); Fields.Add(mFldDef.GetName(), new VectorField(mFldDef, fldId)); } // Spatial is way harder than it needs to be: OSGeo.OSR.SpatialReference sRef = mLayer.GetSpatialRef(); if (sRef == null) { Exception ex = new Exception("Feature class is missing spatial reference"); ex.Data["Path"] = GISFileInfo.FullName; throw ex; } string sRefstring = ""; sRef.ExportToWkt(out sRefstring); _Init(sRefstring); if (!leaveopen) { UnloadDS(); } }
public static List <string> OGRInfo(string datasourceFileLocation) { List <string> info = new List <string>(); Ogr.RegisterAll(); DataSource ds = Ogr.Open(datasourceFileLocation, 0); if (ds == null) { info.Add("Couldn not open vector data source."); return(info); } OSGeo.OGR.Driver drv = ds.GetDriver(); if (drv == null) { info.Add("Could not find driver to open vector data source."); return(info); } info.Add("Using driver: " + drv.GetName()); ///Iterating through layers for (int iLayer = 0; iLayer < ds.GetLayerCount(); iLayer++) { Layer layer = ds.GetLayerByIndex(iLayer); if (layer == null) { info.Add("Could not find layers in the vector data source."); return(info); } FeatureDefn def = layer.GetLayerDefn(); info.Add("Layer name: " + def.GetName()); info.Add("Feature count: " + layer.GetFeatureCount(1)); Envelope ext = new Envelope(); layer.GetExtent(ext, 1); info.Add("Extent: " + ext.MinX + ", " + ext.MinY + ", " + ext.MaxX + ", " + ext.MaxY); ///Reading the spatial reference OSGeo.OSR.SpatialReference sr = layer.GetSpatialRef(); string srs_wkt = string.Empty; if (sr != null) { sr.ExportToPrettyWkt(out srs_wkt, 1); } else { srs_wkt = "(unknow)"; } info.Add("Layer SRS WKT: " + srs_wkt); ///Reading the fields info.Add("Field Names (type): "); for (int iAttr = 0; iAttr < def.GetFieldCount(); iAttr++) { FieldDefn fdef = def.GetFieldDefn(iAttr); info.Add(fdef.GetName() + " (" + fdef.GetFieldTypeName(fdef.GetFieldType()) + ")"); } } ds.Dispose(); return(info); }
public static List <string> getShapeFieldDataList(string strVectorFile) { List <string> list = new List <string>(); #region ReadShape Gdal.AllRegister(); // 为了支持中文路径,请添加下面这句代码 OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); // 为了使属性表字段支持中文,请添加下面这句 OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", ""); // 注册所有的驱动 Ogr.RegisterAll(); //打开数据 DataSource ds = Ogr.Open(strVectorFile, 0); if (ds == null) { MessageBox.Show("打开文件【{0}】失败!", strVectorFile); return(list); } //MessageBox.Show("打开文件【{0}】成功!", strVectorFile); // 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个 int iLayerCount = ds.GetLayerCount(); // 获取第一个图层 Layer oLayer = ds.GetLayerByIndex(0); if (oLayer == null) { MessageBox.Show("获取第{0}个图层失败!\n", "0"); return(list); } // 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空 oLayer.ResetReading(); FeatureDefn oDefn = oLayer.GetLayerDefn(); // 输出图层中的要素个数 int iFieldCount = oDefn.GetFieldCount(); Feature oFeature = null; // 下面开始遍历图层中的要素 while ((oFeature = oLayer.GetNextFeature()) != null) { // 获取要素中的属性表内容 for (int iField = 0; iField < iFieldCount; iField++) { FieldDefn oFieldDefn = oDefn.GetFieldDefn(iField); FieldType type = oFieldDefn.GetFieldType(); string sFieldName = oFieldDefn.GetNameRef(); switch (type) { case FieldType.OFTString: //MessageBox.Show(iField+"=="+oFeature.GetFieldAsString(iField)); break; case FieldType.OFTReal: //MessageBox.Show(iField + "==" + oFeature.GetFieldAsDouble(iField)); break; case FieldType.OFTInteger: //MessageBox.Show(iField + "==" + oFeature.GetFieldAsInteger(iField)); break; default: //MessageBox.Show(iField + "==" + oFeature.GetFieldAsString(iField)); //list.Add(oFeature.GetFieldAsString(iField)); break; } if (sFieldName.Equals("ADM0_NAME")) { list.Add(oFeature.GetFieldAsString(iField)); } } } #endregion list.Sort(); return(list); }
private static void ReportFeature(Feature f, FeatureDefn def) { //string layerName = def.GetName();//Links int fid = f.GetFID(); //0 1 2 3...15 int nFieldCount = f.GetFieldCount(); //3 for (int iField = 0; iField < nFieldCount; iField++) { FieldDefn fdef = def.GetFieldDefn(iField); string fieldName = fdef.GetName(); //Id Name URL string fieldNameRef = fdef.GetNameRef(); //Id Name URL string fieldTypeName = fdef.GetFieldTypeName(fdef.GetFieldType()); //Integer String String if (f.IsFieldSet(iField)) { if (fdef.GetFieldType() == FieldType.OFTStringList) { string[] sList = f.GetFieldAsStringList(iField); foreach (string s in sList) { } } else if (fdef.GetFieldType() == FieldType.OFTIntegerList) { int count; int[] iList = f.GetFieldAsIntegerList(iField, out count); for (int i = 0; i < count; i++) { } } else if (fdef.GetFieldType() == FieldType.OFTRealList) { int count; double[] iList = f.GetFieldAsDoubleList(iField, out count); for (int i = 0; i < count; i++) { } } else if (fdef.GetFieldType() == FieldType.OFTString) { string strField = f.GetFieldAsString(iField); } else if (fdef.GetFieldType() == FieldType.OFTInteger) { int nField = f.GetFieldAsInteger(iField); } else if (fdef.GetFieldType() == FieldType.OFTReal) { double fField = f.GetFieldAsDouble(iField); } else { // other types } } } if (f.GetStyleString() != null) { string style = f.GetStyleString(); } // feature's geometry info Geometry geom = f.GetGeometryRef(); if (geom != null) { string geomName = geom.GetGeometryName(); //POINT string geomType = geom.GetGeometryType().ToString(); //wkbPoint int geometryCount = geom.GetGeometryCount(); //0 for (int i = 0; i < geometryCount; i++) { Geometry sub_geom = geom.GetGeometryRef(i); if (sub_geom != null) { string sub_geomName = sub_geom.GetGeometryName(); string sub_geomType = sub_geom.GetGeometryType().ToString(); } } Envelope env = new Envelope(); geom.GetEnvelope(env); string geom_wkt; geom.ExportToWkt(out geom_wkt);//POINT(-63.4,46.6) } }
//生成的线shp函数 public void lines() { double x = 0; double y = 0; int z = 0; string pszDriverName = "ESRI Shapefile"; OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver poDriver = OSGeo.OGR.Ogr.GetDriverByName(pszDriverName); if (poDriver == null) { MessageBox.Show("Driver Error"); } OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); //用此Driver创建Shape文件//数据源 OSGeo.OGR.DataSource poDS; poDS = poDriver.CreateDataSource("D:\\SHP_TRY", null);//指定存储文件 if (poDS == null) { MessageBox.Show("DataSource Creation Error"); } // 创建图层 Layer oLayer = poDS.CreateLayer("lines", null, wkbGeometryType.wkbLineString, null);//图层名字为【CreateLayer(名字,类型,null)】 if (oLayer == null) { Console.WriteLine("图层创建失败!\n"); return; } // 下面创建属性表 // 先创建一个叫FieldID的整型属性 FieldDefn oFieldID = new FieldDefn("FieldID", FieldType.OFTInteger); oLayer.CreateField(oFieldID, 0); // 再创建一个叫FeatureName的字符型属性,字符长度为50 FieldDefn oFieldName = new FieldDefn("FieldName", FieldType.OFTString); oFieldName.SetWidth(100); oLayer.CreateField(oFieldName, 1); FeatureDefn oDefn = oLayer.GetLayerDefn(); // 创建要素 Feature oFeatureTriangle = new Feature(oDefn); OSGeo.OGR.Geometry pt = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLineString); oFeatureTriangle.SetField(0, 1); oFeatureTriangle.SetField(1, "line_try");//线要素名字 //写入属性!!!!!!这里是根据基站的TXT的做的实验以后可以改数据,文件地址根据实际情况可以修改 string path = "C:\\Users\\Tianh\\Desktop\\station.txt"; string l; StreamReader sr = new StreamReader(path, Encoding.Default); while ((l = sr.ReadLine()) != null) { string[] strArr = sr.ReadLine().Split('\t'); x = Convert.ToDouble(strArr[2]); //经度 y = Convert.ToDouble(strArr[1]); //纬度 pt.AddPoint(x, y, z); } oFeatureTriangle.SetGeometry(pt); oLayer.CreateFeature(oFeatureTriangle); oFeatureTriangle.Dispose(); poDS.Dispose(); MessageBox.Show("生成文件在:D:\\SHP_TRY!"); }
static DataSet CreateTables(DataSource OGRDataSource, string MSSQLConnectionString) { // Create OSM ADO.NET DataSet DataSet OSMDataSet = new DataSet(); // Create SQL Tables for (int iLayer = 0; iLayer < OGRDataSource.GetLayerCount(); iLayer++) { Layer OGRLayer = OGRDataSource.GetLayerByIndex(iLayer); string layerName = OGRLayer.GetName(); // Construct CREATE TABLE statement StringBuilder SQLCreateCmd = new StringBuilder(); SQLCreateCmd.Append(string.Format("CREATE TABLE [{0}] (", layerName)); SQLCreateCmd.Append("[id] [INT] IDENTITY(1,1), "); FeatureDefn OGRLayerDef = OGRLayer.GetLayerDefn(); for (int iField = 0; iField < OGRLayerDef.GetFieldCount(); iField++) { FieldDefn OGRFieldDef = OGRLayerDef.GetFieldDefn(iField); SQLCreateCmd.Append(string.Format("[{0}] " + "[VARCHAR](MAX), ", OGRFieldDef.GetName())); } SQLCreateCmd.Append("[ogr_geometry] [GEOMETRY],"); SQLCreateCmd.Append("[ogr_geometry_area] [FLOAT]);"); //geometry_columns metadata string SQLGeometryColumnsCmd = string.Format(@"IF OBJECT_ID('dbo.geometry_columns') IS NOT NULL INSERT INTO [dbo].[geometry_columns] ([f_table_catalog],[f_table_schema],[f_table_name],[f_geometry_column],[coord_dimension],[srid],[geometry_type]) VALUES (DB_NAME(),SCHEMA_NAME(),'{0}','ogr_geometry',2,900913,'{1}')", layerName, OGRLayer.GetGeomType().ToString().Replace("wkb", "") ); // Construct SQL statement used to get table schema // We use this to set a DataTable object schema after we create the SQL table string SQLSchemaCmd = string.Format("SET FMTONLY ON; SELECT * FROM [{0}]; SET FMTONLY OFF;", layerName); // Execute SQL DataTable table = new DataTable(); using (SqlConnection con = new SqlConnection(MSSQLConnectionString)) { con.Open(); try { // Create SQL table using (SqlCommand cmd = new SqlCommand(SQLCreateCmd.ToString(), con)) { log(TraceLevel.Info, string.Format("Creating table {0}...", layerName)); cmd.ExecuteNonQuery(); } // Set DataTable object schema using (SqlDataAdapter da = new SqlDataAdapter(SQLSchemaCmd, con)) { da.FillSchema(table, SchemaType.Source); // Hack to set ogr_geometry datatable column to correct SQLGeometry type // http://msdn.microsoft.com/en-us/library/ms143179(v=sql.110).aspx#Y2686 // http://connect.microsoft.com/SQLServer/feedback/details/685654/invalidcastexception-retrieving-sqlgeography-column-in-ado-net-data-reader table.Columns["ogr_geometry"].DataType = typeof(SqlGeometry); // Add DataTable to OSM DataSet OSMDataSet.Tables.Add(table); } } catch (Exception e) { log(TraceLevel.Error, e.Message); Environment.Exit(1); } //insert geoemtry_columns record try { using (SqlCommand cmd = new SqlCommand(SQLGeometryColumnsCmd, con)) { log(TraceLevel.Info, string.Format("Update geometry_columns metadata for {0}...", layerName)); cmd.ExecuteNonQuery(); } } catch (Exception e) { log(TraceLevel.Warning, e.Message); } } } return(OSMDataSet); }
static IEnumerable <DataTable> ReadData(DataSource OGRDataSource, DataSet OSMDataSet, int SQLBatchSize) { int featureCount = 0; // Create coordinate transformation SpatialReference sourceSRS = new SpatialReference(""); sourceSRS.ImportFromEPSG(4326); SpatialReference targetSRS = new SpatialReference(""); targetSRS.ImportFromEPSG(900913); CoordinateTransformation transform = new CoordinateTransformation(sourceSRS, targetSRS); // Use interleaved reading - http://www.gdal.org/drv_osm.html bool bHasLayersNonEmpty = false; do { bHasLayersNonEmpty = false; for (int iLayer = 0; iLayer < OGRDataSource.GetLayerCount(); iLayer++) { Layer OGRLayer = OGRDataSource.GetLayerByIndex(iLayer); log(TraceLevel.Verbose, string.Format("Processing {0}...", OGRLayer.GetName())); FeatureDefn OGRFeatDef = OGRLayer.GetLayerDefn(); DataTable buffer = OSMDataSet.Tables[OGRLayer.GetName()]; Feature feat; while ((feat = OGRLayer.GetNextFeature()) != null) { bHasLayersNonEmpty = true; // Commit buffer larger than batch size if (buffer.Rows.Count >= SQLBatchSize) { yield return(buffer.Copy()); buffer.Rows.Clear(); } // Fill buffer row DataRow row = buffer.NewRow(); for (int iField = 0; iField < OGRFeatDef.GetFieldCount(); iField++) { if (feat.IsFieldSet(iField)) { // Add one to skip id IDENTITY column row[iField + 1] = feat.GetFieldAsString(iField); } } // Get OGR geometry object Geometry geom = feat.GetGeometryRef(); // Project from EPSG:4326 to EPSG:900913 geom.Transform(transform); // Serialize to WKB byte[] geomBuffer = new byte[geom.WkbSize()]; geom.ExportToWkb(geomBuffer); // Set ogr_geometry buffer column from WKB try { SqlGeometry sqlGeom = SqlGeometry.STGeomFromWKB(new SqlBytes(geomBuffer), 900913).MakeValid(); row["ogr_geometry"] = sqlGeom; row["ogr_geometry_area"] = sqlGeom.STArea().Value; // Add row to buffer buffer.Rows.Add(row); } catch (Exception e) { log(TraceLevel.Warning, string.Format("Cannot process osm_id: {0} ({1})", feat.GetFID(), e.Message)); } // Update progress featureCount++; } // Commit buffer before moving on to another layer if (buffer.Rows.Count != 0) { yield return(buffer.Copy()); buffer.Rows.Clear(); } } } while (bHasLayersNonEmpty); }
public override void ReinitializeMetaData() { base.ReinitializeMetaData(); IDTSInput100 input = ComponentMetaData.InputCollection[0]; if (!this.validExternalMetadata && this.isConnected) { input.ExternalMetadataColumnCollection.RemoveAll(); input.InputColumnCollection.RemoveAll(); this.validExternalMetadata = true; Layer OGRLayer = this.getLayer(); FeatureDefn OGRFeatureDef = OGRLayer.GetLayerDefn(); int i = 0; while (i < OGRFeatureDef.GetFieldCount()) { //map OGR field type to SSIS data type FieldDefn OGRFieldDef = OGRFeatureDef.GetFieldDefn(i); DataType BufferDataType = this.OGRTypeToBufferType(OGRFieldDef.GetFieldType()); int length = 0; int precision = OGRFieldDef.GetWidth(); int scale = OGRFieldDef.GetPrecision(); int codepage = 1252; switch (BufferDataType) { case DataType.DT_WSTR: length = precision; codepage = 0; precision = 0; scale = 0; //check for length == 0 if (length == 0) { BufferDataType = DataType.DT_NTEXT; } break; default: length = 0; precision = 0; codepage = 0; scale = 0; break; } IDTSExternalMetadataColumn100 ecol = input.ExternalMetadataColumnCollection.New(); ecol.Name = OGRFieldDef.GetName(); ecol.DataType = BufferDataType; ecol.Length = length; ecol.Precision = precision; ecol.Scale = scale; ecol.CodePage = codepage; i++; } //get geometry column string geomtryColumn = (OGRLayer.GetGeometryColumn() != "") ? OGRLayer.GetGeometryColumn() : "GEOMETRY"; //Set OGRGeometry external metadata column IDTSExternalMetadataColumn100 egeomCol = input.ExternalMetadataColumnCollection.New(); egeomCol.Name = geomtryColumn; egeomCol.DataType = DataType.DT_IMAGE; egeomCol.Precision = 0; egeomCol.Length = 0; egeomCol.Scale = 0; egeomCol.CodePage = 0; //set geometry column custom property ComponentMetaData.CustomPropertyCollection["Geometry Column"].Value = geomtryColumn; } if (!ComponentMetaData.AreInputColumnsValid) { ComponentMetaData.RemoveInvalidInputColumns(); } }
public override void ProcessInput(int inputID, PipelineBuffer buffer) { Layer OGRLayer = this.getLayer(); FeatureDefn OGRFeatureDef = OGRLayer.GetLayerDefn(); int batchCount = 0; OGRLayer.StartTransaction(); //initialize columnInfo object columnInfo ci = new columnInfo(); while (buffer.NextRow()) { try { //Start transaction if (this.batchSize != 0 && batchCount % this.batchSize == 0) { OGRLayer.CommitTransaction(); OGRLayer.StartTransaction(); batchCount = 0; } Feature OGRFeature = new Feature(OGRFeatureDef); for (int i = 0; i < this.columnInformation.Count; i++) { ci = this.columnInformation[i]; if (!buffer.IsNull(ci.bufferColumnIndex)) { if (ci.geom) { byte[] geomBytes = new byte[buffer.GetBlobLength(ci.bufferColumnIndex)]; geomBytes = buffer.GetBlobData(ci.bufferColumnIndex, 0, geomBytes.Length); Geometry geom = Geometry.CreateFromWkb(geomBytes); OGRFeature.SetGeometry(geom); } else { int OGRFieldIndex = OGRFeatureDef.GetFieldIndex(ci.columnName); FieldDefn OGRFieldDef = OGRFeatureDef.GetFieldDefn(OGRFieldIndex); FieldType OGRFieldType = OGRFieldDef.GetFieldType(); //declare datetime variables DateTime dt; TimeSpan ts; switch (OGRFieldType) { //case FieldType.OFTBinary: // break; case FieldType.OFTDate: dt = buffer.GetDate(ci.bufferColumnIndex); OGRFeature.SetField(OGRFieldIndex, dt.Year, dt.Month, dt.Day, 0, 0, 0, 0); break; case FieldType.OFTDateTime: dt = buffer.GetDateTime(ci.bufferColumnIndex); //get timezone? OGRFeature.SetField(OGRFieldIndex, dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, 0); break; case FieldType.OFTInteger: OGRFeature.SetField(OGRFieldIndex, buffer.GetInt32(ci.bufferColumnIndex)); break; case FieldType.OFTInteger64: OGRFeature.SetField(OGRFieldIndex, buffer.GetInt64(ci.bufferColumnIndex)); break; case FieldType.OFTReal: OGRFeature.SetField(OGRFieldIndex, buffer.GetDouble(ci.bufferColumnIndex)); break; case FieldType.OFTTime: ts = buffer.GetTime(ci.bufferColumnIndex); OGRFeature.SetField(OGRFieldIndex, 0, 0, 0, ts.Hours, ts.Minutes, ts.Seconds, 0); break; case FieldType.OFTString: default: OGRFeature.SetField(OGRFieldIndex, buffer.GetString(ci.bufferColumnIndex)); break; } } } } OGRLayer.CreateFeature(OGRFeature); batchCount++; //increment incrementPipelinePerfCounters to display correct # of rows written ComponentMetaData.IncrementPipelinePerfCounter(103, 1); } catch (Exception ex) { //Redirect row IDTSInputColumn100 inputColumn = ComponentMetaData.InputCollection[0].InputColumnCollection.GetInputColumnByLineageID(ci.lineageID); IDTSOutput100 output = ComponentMetaData.OutputCollection[0]; if (ci.errorDisposition == DTSRowDisposition.RD_RedirectRow) { int errorCode = System.Runtime.InteropServices.Marshal.GetHRForException(ex); buffer.DirectErrorRow(output.ID, errorCode, inputColumn.LineageID); } else if (ci.errorDisposition == DTSRowDisposition.RD_FailComponent || ci.errorDisposition == DTSRowDisposition.RD_NotUsed) { OGRLayer.RollbackTransaction(); ComponentMetaData.FireError(0, ComponentMetaData.Name, ex.Message, string.Empty, 0, out cancel); throw new Exception(ex.Message); } } } OGRLayer.CommitTransaction(); }
/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param> protected override void SolveInstance(IGH_DataAccess DA) { ///TODO: fix crash with "multi" types in a branch for shapefiles, can't create lines in a points layer /// fix mesh/polygon face creation issue on sphere, dropping faces or flipped faces /// fix swtich case for shapfiles so that points and multipoints (eg) are written to the same file. don't use switch anymore, us ifs /// fix sql statements, they don't seem to have an effect. Need these to work for pulling apart geometry collections. ///Gather GHA inputs string filename = string.Empty; DA.GetData <string>("Vector Data Filename", ref filename); string folder = string.Empty; DA.GetData <string>("Vector Data Folder", ref folder); folder = Path.GetFullPath(folder); if (!folder.EndsWith(Path.DirectorySeparatorChar.ToString())) { folder += Path.DirectorySeparatorChar; } string shpPath = folder + filename + drvExtension; ///for more than one geometry type, a list of files for shapefile output needs to be established List <string> shpPathList = new List <string>(); List <string> shpTypeList = new List <string>(); List <string> fields = new List <string>(); DA.GetDataList <string>("Fields", fields); GH_Structure <GH_String> values = new GH_Structure <GH_String>(); DA.GetDataTree <GH_String>("Values", out values); GH_Structure <IGH_GeometricGoo> gGoo = new GH_Structure <IGH_GeometricGoo>(); DA.GetDataTree <IGH_GeometricGoo>("Feature Geometry", out gGoo); bool export = false; DA.GetData <bool>("Export", ref export); ///GDAL setup RESTful.GdalConfiguration.ConfigureOgr(); OSGeo.GDAL.Gdal.SetConfigOption("OGR_SKIP", "KML"); string driverType = drvType; //OSGeo.OGR.Driver drv = Ogr.GetDriverByName("LIBKML");// driverType); OSGeo.OGR.Driver drv = Ogr.GetDriverByName("GeoJSON"); if (export == true) { ///File setup for save FileInfo file = new FileInfo(folder); file.Directory.Create(); if (File.Exists(shpPath)) { drv.DeleteDataSource(shpPath); } ///Create virtual datasource to be converted later ///Using geojson as a flexiblle base file type which can be converted later with ogr2ogr DataSource ds = drv.CreateDataSource("/vsimem/out.geojson", null); ///Use WGS84 spatial reference OSGeo.OSR.SpatialReference dst = new OSGeo.OSR.SpatialReference(""); dst.SetWellKnownGeogCS("WGS84"); Transform transform = Heron.Convert.XYZToWGSTransform(); ///Use OGR catch-all for geometry types var gtype = wkbGeometryType.wkbGeometryCollection; ///Create layer //string[] layerOptions = new string[] { "LIBKML_USE_SCHEMADATA=NO", "LIBKML_USE_SIMPLEFIELD=NO", "LIBKML_ALTITUDEMODE_FIELD=relativeToGround" }; //string[] layerOptions = new string[] { "LIBKML_STRICT_COMPLIANCE=FALSE" }; OSGeo.OGR.Layer layer = ds.CreateLayer(filename, dst, gtype, null); FeatureDefn def = layer.GetLayerDefn(); ///Add fields to layer for (int f = 0; f < fields.Count; f++) { OSGeo.OGR.FieldDefn fname = new OSGeo.OGR.FieldDefn(fields[f], OSGeo.OGR.FieldType.OFTString); layer.CreateField(fname, f); } ///Specific fields for LIBKML for use in Google Earth ///See LIBMKL driver for more info https://gdal.org/drivers/vector/libkml.html if (drvType == "LIBKML") { OSGeo.OGR.FieldDefn kmlFieldAltitudeMode = new OSGeo.OGR.FieldDefn("altitudeMode", OSGeo.OGR.FieldType.OFTString); layer.CreateField(kmlFieldAltitudeMode, fields.Count()); //OSGeo.OGR.FieldDefn kmlFieldExtrude = new OSGeo.OGR.FieldDefn("tessellate", OSGeo.OGR.FieldType.OFTInteger); //layer.CreateField(kmlFieldExtrude, fields.Count()+1); } for (int a = 0; a < gGoo.Branches.Count; a++) { ///create feature OSGeo.OGR.Feature feature = new OSGeo.OGR.Feature(def); ///Set LIBKML specific fields for use in Google Earth, defaulting to 'relativeToGround'. Consider setting to 'absolute'. if (drvType == "LIBKML") { feature.SetField("altitudeMode", "relativeToGround"); //feature.SetField("altitudeMode", "absolute"); //feature.SetField("tessellate", 0); } ///TODO: Build style table OSGeo.OGR.StyleTable styleTable = new StyleTable(); //feature.SetStyleString("BRUSH(fc:#0000FF);PEN(c:#000000)"); ///Get geometry type(s) in branch var geomList = gGoo.Branches[a]; string geomType = string.Empty; List <string> geomTypeList = geomList.Select(o => o.TypeName).ToList(); ///Test if geometry in the branch is of the same type. ///If there is more than one element of a type, tag as multi, if there is more than one type, tag as mixed if (geomTypeList.Count == 1) { geomType = geomTypeList.First(); } else if (geomTypeList.Count > 1 && geomTypeList.All(gt => gt == geomTypeList.First())) { geomType = "Multi" + geomTypeList.First(); } else { geomType = "Mixed"; } ///For testing //AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, geomType); ///Add geomtery to feature ///Create containers for translating from GH Goo Point3d pt = new Point3d(); List <Point3d> pts = new List <Point3d>(); Curve crv = null; List <Curve> crvs = new List <Curve>(); Mesh mesh = new Mesh(); Mesh multiMesh = new Mesh(); switch (geomType) { case "Point": geomList.First().CastTo <Point3d>(out pt); feature.SetGeometry(Heron.Convert.Point3dToOgrPoint(pt, transform)); if (!shpTypeList.Contains("POINT")) { shpTypeList.Add("POINT"); } break; case "MultiPoint": foreach (var point in geomList) { point.CastTo <Point3d>(out pt); pts.Add(pt); } feature.SetGeometry(Heron.Convert.Point3dsToOgrMultiPoint(pts, transform)); if (!shpTypeList.Contains("MULTIPOINT")) { shpTypeList.Add("MULTIPOINT"); } break; case "Curve": geomList.First().CastTo <Curve>(out crv); feature.SetGeometry(Heron.Convert.CurveToOgrLinestring(crv, transform)); if (!shpTypeList.Contains("LINESTRING")) { shpTypeList.Add("LINESTRING"); } break; case "MultiCurve": foreach (var curve in geomList) { curve.CastTo <Curve>(out crv); crvs.Add(crv); } feature.SetGeometry(Heron.Convert.CurvesToOgrMultiLinestring(crvs, transform)); if (!shpTypeList.Contains("MULTILINESTRING")) { shpTypeList.Add("MULTILINESTRING"); } break; case "Mesh": geomList.First().CastTo <Mesh>(out mesh); feature.SetGeometry(Heron.Convert.MeshToMultiPolygon(mesh, transform)); if (!shpTypeList.Contains("MULTIPOLYGON")) { shpTypeList.Add("MULTIPOLYGON"); } break; case "MultiMesh": foreach (var m in geomList) { Mesh meshPart = new Mesh(); m.CastTo <Mesh>(out meshPart); multiMesh.Append(meshPart); } feature.SetGeometry(Heron.Convert.MeshToMultiPolygon(multiMesh, transform)); if (!shpTypeList.Contains("MULTIPOLYGON")) { shpTypeList.Add("MULTIPOLYGON"); } break; case "Mixed": OSGeo.OGR.Geometry geoCollection = new OSGeo.OGR.Geometry(wkbGeometryType.wkbGeometryCollection); for (int gInt = 0; gInt < geomList.Count; gInt++) { string geomTypeMixed = geomTypeList[gInt]; switch (geomTypeMixed) { case "Point": geomList[gInt].CastTo <Point3d>(out pt); geoCollection.AddGeometry(Heron.Convert.Point3dToOgrPoint(pt, transform)); break; case "Curve": geomList[gInt].CastTo <Curve>(out crv); geoCollection.AddGeometry(Heron.Convert.CurveToOgrLinestring(crv, transform)); break; case "Mesh": geomList[gInt].CastTo <Mesh>(out mesh); geoCollection.AddGeometry(Ogr.ForceToMultiPolygon(Heron.Convert.MeshToMultiPolygon(mesh, transform))); break; default: AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, "Not able to export " + geomType + " geometry at branch " + gGoo.get_Path(a).ToString() + ". Geometry must be a Point, Curve or Mesh."); break; } } feature.SetGeometry(geoCollection); if (!shpTypeList.Contains("GEOMETRYCOLLECTION")) { shpTypeList.Add("GEOMETRYCOLLECTION"); } break; default: AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, "Not able to export " + geomType + " geometry at branch " + gGoo.get_Path(a).ToString() + ". Geometry must be a Point, Curve or Mesh."); break; } ///Give the feature a unique ID feature.SetFID(a); ///Add values to fields GH_Path path = gGoo.get_Path(a); for (int vInt = 0; vInt < fields.Count; vInt++) { string val = string.Empty; if (values.get_Branch(path) != null) { val = values.get_DataItem(path, vInt).ToString(); } feature.SetField(fields[vInt], val); } ///Save feature to layer layer.CreateFeature(feature); ///Cleanup feature.Dispose(); } layer.Dispose(); ds.Dispose(); drv.Dispose(); ///Convert in memory dataset to file using ogr2ogr ///For KML set 'altitudeMode' to 'relativeToGround' or 'absolute' ///Set base options for all export types if (drvType == "KML") { drvType = "LIBKML"; } List <string> ogr2ogrOptions = new List <string> { "-overwrite", "-f", drvType, "-dim", "XYZ", "-skipfailures", //"-lco", "LIBKML_STRICT_COMPLIANCE=FALSE", //"-lco", "AltitudeMode=absolute", //"-dsco", "SHAPE_REWIND_ON_WRITE=YES" }; Dataset src = Gdal.OpenEx("/vsimem/out.geojson", 0, null, null, null); if (drvType != "ESRI Shapefile") { Dataset destDataset = Gdal.wrapper_GDALVectorTranslateDestName(shpPath, src, new GDALVectorTranslateOptions(ogr2ogrOptions.ToArray()), null, null); destDataset.Dispose(); shpPathList.Add(shpPath); } ///Export multiple layers for shapefile ///https://trac.osgeo.org/gdal/wiki/FAQVector#HowdoItranslateamixedgeometryfiletoshapefileformat else { /// if (shpTypeList.Count <= 1 && shpTypeList.First() != "GEOMETRYCOLLECTION") { if (shpTypeList.First() == "POLYGON" || shpTypeList.First() == "MULTIPOLYGON") { ogr2ogrOptions.AddRange(new List <string> { "-lco", "SHPT=MULTIPATCH" }); } Dataset destDataset = Gdal.wrapper_GDALVectorTranslateDestName(shpPath, src, new GDALVectorTranslateOptions(ogr2ogrOptions.ToArray()), null, null); destDataset.Dispose(); shpPathList.Add(shpPath); } else { ///Add -explodecollections for mixed geometries in a branch ///"-where" statement is not necessary, but could speed up big datasets string shpFileName = string.Empty; List <string> ogr2ogrShpOptions = new List <string>(); if (shpTypeList.Contains("POINT") || shpTypeList.Contains("MULTIPOINT")) { shpFileName = folder + filename + "_points.shp"; shpPathList.Add(shpFileName); List <string> ogr2ogrShpOptionsPts = new List <string> { "-overwrite", "-f", drvType, "-dim", "XYZ", "-skipfailures" }; //ogr2ogrShpOptionsPts.AddRange(new List<string> { "-where", "ogr_geometry=POINT", "-where", "ogr_geometry=MULTIPOINT", "-lco", "SHPT=MULTIPOINTZ", "-nlt", "PROMOTE_TO_MULTI"}); ogr2ogrShpOptionsPts.AddRange(new List <string> { "-sql", "SELECT * FROM " + filename + " WHERE OGR_GEOMETRY='MULTIPOINT' OR OGR_GEOMETRY='POINT'", "-lco", "SHPT=MULTIPOINTZ", "-nlt", "PROMOTE_TO_MULTI" }); //ogr2ogrShpOptionsPts.AddRange(new List<string> { "-dialect", "sqlite", "-sql", "select * from " + filename + " where GeometryType(geometry) in ('POINT','MULTIPOINT')", "-lco", "SHPT=MULTIPOINTZ", "-nlt", "PROMOTE_TO_MULTI" }); Dataset destDatasetPoint = Gdal.wrapper_GDALVectorTranslateDestName(shpFileName, src, new GDALVectorTranslateOptions(ogr2ogrShpOptionsPts.ToArray()), null, null); destDatasetPoint.Dispose(); } if (shpTypeList.Contains("LINESTRING") || shpTypeList.Contains("MULTILINESTRING")) { shpFileName = folder + filename + "_lines.shp"; shpPathList.Add(shpFileName); List <string> ogr2ogrShpOptionsLines = new List <string> { "-overwrite", "-f", drvType, "-dim", "XYZ", "-skipfailures" }; //ogr2ogrShpOptionsLines.AddRange(new List<string> { "-where", "ogr_geometry=LINESTRING25D", "-where", "ogr_geometry=MULTILINESTRING25D", "-lco", "SHPT=ARCZ", "-nlt", "PROMOTE_TO_MULTI" }); ogr2ogrShpOptionsLines.AddRange(new List <string> { "-sql", "SELECT * FROM " + filename + " WHERE OGR_GEOMETRY='LINESTRING' OR OGR_GEOMETRY='MULTILINESTRING'", "-lco", "SHPT=ARCZ", "-nlt", "PROMOTE_TO_MULTI" }); //ogr2ogrShpOptionsLines.AddRange(new List<string> { "-dialect", "sqlite", "-sql", "select * from " + filename + " where GeometryType(geometry) in ('LINESTRING','MULTILINESTRING')", "-lco", "SHPT=ARCZ", "-nlt", "PROMOTE_TO_MULTI" }); Dataset destDatasetLinestring = Gdal.wrapper_GDALVectorTranslateDestName(shpFileName, src, new GDALVectorTranslateOptions(ogr2ogrShpOptionsLines.ToArray()), null, null); destDatasetLinestring.Dispose(); } if (shpTypeList.Contains("POLYGON") || shpTypeList.Contains("MULTIPOLYGON")) { shpFileName = folder + filename + "_polygons.shp"; shpPathList.Add(shpFileName); List <string> ogr2ogrShpOptionsPolygons = new List <string> { "-overwrite", "-f", drvType, "-dim", "XYZ", "-skipfailures", "-dsco", "SHAPE_REWIND_ON_WRITE=NO" }; //ogr2ogrShpOptionsPolygons.AddRange(new List<string> { "-where", "ogr_geometry=POLYGON", "-where", "ogr_geometry=MULTIPOLYGON", "-lco", "SHPT=POLYGONZ", "-nlt", "PROMOTE_TO_MULTI" }); ogr2ogrShpOptionsPolygons.AddRange(new List <string> { "-sql", "SELECT * FROM " + filename + " WHERE OGR_GEOMETRY='MULTIPOLYGON25D' OR OGR_GEOMETRY='POLYGON25D'", "-lco", "SHPT=POLYGONZ", "-nlt", "PROMOTE_TO_MULTI" }); Dataset destDatasetPolygon = Gdal.wrapper_GDALVectorTranslateDestName(shpFileName, src, new GDALVectorTranslateOptions(ogr2ogrShpOptionsPolygons.ToArray()), null, null); destDatasetPolygon.Dispose(); } ///Not working properly when multiple geometry types are part of the same branch for SHP export. if (shpTypeList.Contains("GEOMETRYCOLLECTION")) { AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, "One or more branches contain a mix of geometry types."); ///export points shpFileName = folder + filename + "_gc-points.shp"; shpPathList.Add(shpFileName); List <string> ogr2ogrShpOptionsGCPts = new List <string> { "-overwrite", "-f", drvType, "-dim", "XYZ", "-skipfailures" }; ogr2ogrShpOptionsGCPts.AddRange(new List <string> { "-explodecollections", "-where", "ogr_geometry=GEOMETRYCOLLECTION", "-lco", "SHPT=MULTIPOINTZ", "-nlt", "PROMOTE_TO_MULTI" }); //ogr2ogrShpOptionsGCPts.AddRange(new List<string> { "-explodecollections", "-sql", "SELECT * FROM " + filename + " WHERE OGR_GEOMETRY='MULTIPOINT' OR OGR_GEOMETRY='POINT'", "-lco", "SHPT=MULTIPOINTZ", "-nlt", "PROMOTE_TO_MULTI" }); Dataset destDatasetGCPoints = Gdal.wrapper_GDALVectorTranslateDestName(shpFileName, src, new GDALVectorTranslateOptions(ogr2ogrShpOptionsGCPts.ToArray()), null, null); destDatasetGCPoints.Dispose(); ///export lines shpFileName = folder + filename + "_gc-lines.shp"; shpPathList.Add(shpFileName); List <string> ogr2ogrShpOptionsGCLines = new List <string> { "-overwrite", "-f", drvType, "-dim", "XYZ", "-skipfailures" }; ogr2ogrShpOptionsGCLines.AddRange(new List <string> { "-explodecollections", "-where", "ogr_geometry=GEOMETRYCOLLECTION", "-lco", "SHPT=ARCZ", "-nlt", "PROMOTE_TO_MULTI" }); //ogr2ogrShpOptionsGCLines.AddRange(new List<string> { "-explodecollections", "-sql", "SELECT * FROM " + filename + " WHERE OGR_GEOMETRY='MULTILINESTRING25D' OR OGR_GEOMETRY='LINESTRING25D'", "-lco", "SHPT=ARCZ", "-nlt", "PROMOTE_TO_MULTI" }); Dataset destDatasetGCLines = Gdal.wrapper_GDALVectorTranslateDestName(shpFileName, src, new GDALVectorTranslateOptions(ogr2ogrShpOptionsGCLines.ToArray()), null, null); destDatasetGCLines.Dispose(); ///export meshes shpFileName = folder + filename + "_gc-polygons.shp"; shpPathList.Add(shpFileName); List <string> ogr2ogrShpOptionsGCPolygons = new List <string> { "-overwrite", "-f", drvType, "-dim", "XYZ", "-skipfailures", "-dsco", "SHAPE_REWIND_ON_WRITE=NO" }; ogr2ogrShpOptionsGCPolygons.AddRange(new List <string> { "-explodecollections", "-where", "ogr_geometry=GEOMETRYCOLLECTION", "-lco", "SHPT=POLYGONZ", "-nlt", "PROMOTE_TO_MULTI" }); //ogr2ogrShpOptionsGCPolygons.AddRange(new List<string> { "-explodecollections", "-sql", "SELECT * FROM " + filename + " WHERE OGR_GEOMETRY='MULTIPOLYGON' OR OGR_GEOMETRY='POLYGON'", "-lco", "SHPT=POLYGONZ", "-nlt", "PROMOTE_TO_MULTI" }); Dataset destDatasetGCPolygons = Gdal.wrapper_GDALVectorTranslateDestName(shpFileName, src, new GDALVectorTranslateOptions(ogr2ogrShpOptionsGCPolygons.ToArray()), null, null); destDatasetGCPolygons.Dispose(); } } } ///Clean up Gdal.Unlink("/vsimem/out.geojson"); } DA.SetDataList(0, shpPathList); }
private void filter_true() { string path = textBox_folder.Text; comboStart = dataGridView1.Rows[0].Cells[0].Value.ToString(); comboEnd = dataGridView1.Rows[0].Cells[1].Value.ToString(); string save_LM = "UFL_OPIP_LM" + "_" + comboStart + "_" + comboEnd; string save_PS = "UFL_OPIP_PS" + "_" + comboStart + "_" + comboEnd; string temp_LM = "UFL_OPIP_LM"; string temp_PS = "UFL_OPIP_PS"; string psFilePath = path + "\\" + save_PS; string lmFilePath = path + "\\" + save_LM; int dRcnt = dataGridView1.Rows.Count - 1; int dCcnt = dataGridView1.Columns.Count; textBox_status.AppendText("Shape파일을 생성합니다..." + "\r\n" + "\r\n"); Driver driver = Ogr.GetDriverByName("ESRI Shapefile"); DataSource data_source = driver.CreateDataSource(path, new string[] { "ENCODING=UTF-8" }); OSGeo.OSR.SpatialReference srs = new OSGeo.OSR.SpatialReference(""); srs.ImportFromEPSG(5186); // MessageBox.Show( dataGridView1.Rows[1].Cells[5].Value.ToString()); System.IO.FileInfo fi = new System.IO.FileInfo(psFilePath + ".shp"); if (fi.Exists) { MessageBox.Show("파일이 있습니다"); File.Delete(psFilePath + ".prj"); File.Delete(psFilePath + ".shp"); File.Delete(psFilePath + ".dbf"); File.Delete(psFilePath + ".shx"); } else { //Ps var layer = data_source.CreateLayer(temp_PS, srs, wkbGeometryType.wkbPoint, new string[] { "ENCODING=UTF-8" }); textBox_status.AppendText(psFilePath + ".shp 파일 생성" + "\r\n"); //string x_temp = dataGridView1.Rows[0].Cells[2].Value.ToString(); FieldDefn ftr_cde = new FieldDefn("FTR_CDE", FieldType.OFTString); FieldDefn hjd_cde = new FieldDefn("HJD_CDE", FieldType.OFTString); FieldDefn pip_dep = new FieldDefn("PIP_DEP", FieldType.OFTReal); FieldDefn start_point = new FieldDefn("시점", FieldType.OFTString); FieldDefn end_point = new FieldDefn("종점", FieldType.OFTString); FieldDefn field_x = new FieldDefn("X", FieldType.OFTReal); FieldDefn field_y = new FieldDefn("Y", FieldType.OFTReal); FieldDefn field_z = new FieldDefn("Z", FieldType.OFTReal); layer.CreateField(ftr_cde, 1); layer.CreateField(hjd_cde, 1); layer.CreateField(pip_dep, 1); layer.CreateField(start_point, 1); layer.CreateField(end_point, 1); layer.CreateField(field_x, 1); layer.CreateField(field_y, 1); layer.CreateField(field_z, 1); FeatureDefn ftr = layer.GetLayerDefn(); //FeatureDefn ftr = new FeatureDefn(null); ftr.SetGeomType(layer.GetLayerDefn().GetGeomType()); Feature ipFeature = new Feature(ftr); string wktPointZ = ""; Geometry ipGeom = null; for (int i = 0; i < dRcnt; ++i) { wktPointZ = String.Format("POINT Z({0} {1} {2})", dataGridView1.Rows[i].Cells[2].Value.ToString(), dataGridView1.Rows[i].Cells[3].Value.ToString(), dataGridView1.Rows[i].Cells[4].Value.ToString()); ipGeom = Ogr.CreateGeometryFromWkt(ref wktPointZ, srs); ipFeature.SetGeometry(ipGeom); ipFeature.SetField("FTR_CDE", "SF900"); ipFeature.SetField("HJD_CDE", ""); ipFeature.SetField("PIP_DEP", ""); ipFeature.SetField("시점", dataGridView1.Rows[i].Cells[0].Value.ToString()); ipFeature.SetField("종점", dataGridView1.Rows[i].Cells[1].Value.ToString()); ipFeature.SetField("X", dataGridView1.Rows[i].Cells[2].Value.ToString()); ipFeature.SetField("Y", dataGridView1.Rows[i].Cells[3].Value.ToString()); ipFeature.SetField("Z", dataGridView1.Rows[i].Cells[4].Value.ToString()); layer.CreateFeature(ipFeature); progressBar1.PerformStep(); } layer.CommitTransaction(); layer.SyncToDisk(); layer.Dispose(); data_source.Dispose(); System.IO.FileInfo fil = new System.IO.FileInfo(path + "\\" + temp_PS + ".shp"); if (fil.Exists) { System.IO.File.Move(path + "\\" + temp_PS + ".shp", psFilePath + ".shp"); System.IO.File.Move(path + "\\" + temp_PS + ".cpg", psFilePath + ".cpg"); System.IO.File.Move(path + "\\" + temp_PS + ".dbf", psFilePath + ".dbf"); System.IO.File.Move(path + "\\" + temp_PS + ".prj", psFilePath + ".prj"); System.IO.File.Move(path + "\\" + temp_PS + ".shx", psFilePath + ".shx"); } } //LM System.IO.FileInfo fLM = new System.IO.FileInfo(lmFilePath + ".shp"); if (fLM.Exists) { MessageBox.Show(lmFilePath + "이 있습니다"); File.Delete(lmFilePath + ".prj"); File.Delete(lmFilePath + ".shp"); File.Delete(lmFilePath + ".dbf"); File.Delete(lmFilePath + ".shx"); } else { //LM DataSource data_source2 = driver.CreateDataSource(path, new string[] { "ENCODING=UTF-8" }); var layer = data_source2.CreateLayer(temp_LM, srs, wkbGeometryType.wkbLineString, new string[] { "ENCODING=UTF-8" }); textBox_status.AppendText(lmFilePath + ".shp 파일 생성" + "\r\n"); FieldDefn ftr_cde = new FieldDefn("FTR_CDE", FieldType.OFTString); FieldDefn hjd_cde = new FieldDefn("HJD_CDE", FieldType.OFTString); FieldDefn pip_dep = new FieldDefn("PIP_DEP", FieldType.OFTReal); FieldDefn start_point = new FieldDefn("시점", FieldType.OFTString); FieldDefn end_point = new FieldDefn("종점", FieldType.OFTString); FieldDefn field_x = new FieldDefn("X", FieldType.OFTReal); FieldDefn field_y = new FieldDefn("Y", FieldType.OFTReal); FieldDefn field_z = new FieldDefn("Z", FieldType.OFTReal); layer.CreateField(ftr_cde, 1); layer.CreateField(hjd_cde, 1); layer.CreateField(pip_dep, 1); layer.CreateField(start_point, 1); layer.CreateField(end_point, 1); layer.CreateField(field_x, 1); layer.CreateField(field_y, 1); layer.CreateField(field_z, 1); FeatureDefn ftr = layer.GetLayerDefn(); //FeatureDefn ftr = new FeatureDefn(null); ftr.SetGeomType(layer.GetLayerDefn().GetGeomType()); Feature ipFeature = new Feature(ftr); Geometry ipGeom = null; string lineWKT = "LINESTRING ("; for (int i = 0; i < dRcnt; ++i) { string s_x = dataGridView1.Rows[i].Cells[2].Value.ToString(); string s_y = dataGridView1.Rows[i].Cells[3].Value.ToString(); if (i == dRcnt - 1) { lineWKT = lineWKT + s_x + " " + s_y + ")"; progressBar1.PerformStep(); } else { lineWKT = lineWKT + s_x + " " + s_y + ","; progressBar1.PerformStep(); } } ipGeom = Ogr.CreateGeometryFromWkt(ref lineWKT, srs); ipFeature.SetGeometry(ipGeom); ipFeature.SetField("FTR_CDE", "SF900"); ipFeature.SetField("HJD_CDE", ""); ipFeature.SetField("PIP_DEP", ""); ipFeature.SetField("시점", dataGridView1.Rows[0].Cells[0].Value.ToString()); ipFeature.SetField("종점", dataGridView1.Rows[0].Cells[1].Value.ToString()); layer.CreateFeature(ipFeature); layer.CommitTransaction(); layer.SyncToDisk(); layer.Dispose(); data_source2.Dispose(); System.IO.FileInfo film = new System.IO.FileInfo(path + "\\" + temp_LM + ".shp"); if (film.Exists) { System.IO.File.Move(path + "\\" + temp_LM + ".shp", lmFilePath + ".shp"); System.IO.File.Move(path + "\\" + temp_LM + ".cpg", lmFilePath + ".cpg"); System.IO.File.Move(path + "\\" + temp_LM + ".dbf", lmFilePath + ".dbf"); System.IO.File.Move(path + "\\" + temp_LM + ".prj", lmFilePath + ".prj"); System.IO.File.Move(path + "\\" + temp_LM + ".shx", lmFilePath + ".shx"); } textBox_status.AppendText("\r\n" + "Shape파일 생성이 완료되었습니다."); } }
public void directTest() { Gdal.AllRegister(); Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); Gdal.SetConfigOption("SHAPE_ENCODING", ""); Ogr.RegisterAll(); //读取文件 DataSource rs = Ogr.Open(rPath, 0); Layer rLayer = rs.GetLayerByIndex(0); DataSource bs = Ogr.Open(bPath, 0); Layer bLayer = bs.GetLayerByIndex(0); DataSource ss = Ogr.Open(sPath, 0); Layer sLayer = ss.GetLayerByIndex(0); Feature rFeature = null; int i = 0; List <Geometry> geos = new List <Geometry>(); // try // { while ((rFeature = rLayer.GetNextFeature()) != null) { // if (rFeature.GetFID()>740) // { Geometry point = rFeature.GetGeometryRef(); // bean.direct(bLayer, sLayer, point); // Console.WriteLine(rFeature.GetFID() + ":" + bean.direct(bLayer, rLayer, point)); // geos.AddRange(bean.direct(bLayer, sLayer, point,500)); Console.WriteLine(rFeature.GetFID() + ":" + rLayer.GetFeatureCount(0) + ":" + DateTime.Now + ":" + DateTime.Now.Millisecond); // } i++; if (i == 100) { break; } } // } //catch (Exception e) // { // Console.WriteLine(e.Message); // } OSGeo.OGR.Driver oDriver = Ogr.GetDriverByName("ESRI Shapefile"); // 创建数据源 DataSource oDS; if (Ogr.Open(toPath, 0) != null) { oDS = Ogr.Open(toPath, 1); oDS.DeleteLayer(0); } else { oDS = oDriver.CreateDataSource(toPath, null); } Layer toLayer = oDS.CreateLayer("direct", sLayer.GetSpatialRef(), wkbGeometryType.wkbLineString, null); FeatureDefn oDefn = toLayer.GetLayerDefn(); foreach (Geometry geom in geos) { //read current feature Feature feature = new Feature(oDefn); feature.SetGeometry(geom); toLayer.CreateFeature(feature); } oDS.SyncToDisk(); }
public static void Test2() { try { Ogr.RegisterAll(); string shapefile = @"C:\data\Links\Links.shp"; DataSource ds = Ogr.Open(shapefile, 0); Driver driver = ds.GetDriver(); int nLayerCount = ds.GetLayerCount();//1 for (int iLayer = 0; iLayer < nLayerCount; iLayer++) { Layer layer = ds.GetLayerByIndex(iLayer); string layerName = layer.GetName(); int fc = layer.GetFeatureCount(1); Envelope env = new Envelope(); layer.GetExtent(env, 1); //MessageBox.Show("test sr"); OSGeo.OSR.SpatialReference sr = layer.GetSpatialRef(); string sr_wkt; sr.ExportToPrettyWkt(out sr_wkt, 1); layer.GetName(); FeatureDefn def = layer.GetLayerDefn(); def.GetName(); for (int iField = 0; iField < def.GetFieldCount(); iField++) { FieldDefn fdef = def.GetFieldDefn(iField); string fieldName = fdef.GetName(); //Id Name URL FieldType fieldType = fdef.GetFieldType(); //OFTInteger OFTString OFTString string fieldTypeName = fdef.GetFieldTypeName(fdef.GetFieldType()); //Integer String String int width = fdef.GetWidth(); //6 50 254 int precision = fdef.GetPrecision(); //0 0 0 } for (int fid = 0; fid < layer.GetFeatureCount(1); fid++) { Feature f = layer.GetFeature(fid); int id = f.GetFID(); int nFiledCount = f.GetFieldCount(); Geometry geom = f.GetGeometryRef(); // retrive geometry data //this.Geometrys.Add(geom); string geomName = geom.GetGeometryName(); //POINT string geomType = geom.GetGeometryType().ToString(); //wkbPoint Envelope geom_env = new Envelope(); geom.GetEnvelope(geom_env); // wkt string geom_wkt; geom.ExportToWkt(out geom_wkt);//"POINT (-63.490966216299803 46.66247022944782)" int wkbSize = geom.WkbSize(); if (wkbSize > 0) { // wkb byte[] geom_wkb = new byte[wkbSize]; geom.ExportToWkb(geom_wkb); string str_wkb = BitConverter.ToString(geom_wkb); // wkb--->wkt Geometry geom2 = Geometry.CreateFromWkb(geom_wkb); string geom2_wkt; geom2.ExportToWkt(out geom2_wkt); } f.Dispose(); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); return; } }
/// <summary> /// Merge all point assets in one shapefile /// </summary> private void MergeAsset() { // Step1: Create an empty shapefile datasource and a layer as merged file string outputMergefn = "PointMerge.shp"; MergeShpPath = Path.Combine(CopyToSchemePath, outputMergefn); // Make sure to use ESRI standard to keep compatibility Driver driver = Ogr.GetDriverByName("ESRI Shapefile"); if (File.Exists(this.MergeShpPath)) { File.Delete(this.MergeShpPath); } // Configure geospatial parameters for new shapefile, e.g. coordinate system DataSource mergeds = driver.CreateDataSource(CopyToSchemePath, null); SpatialReference srs = new SpatialReference(geoRef); // If the merge file exists, delete it if (File.Exists(MergeShpPath)) { File.Delete(MergeShpPath); } Layer mergeLy = mergeds.CreateLayer("PointMerge", srs, wkbGeometryType.wkbPoint, null); DataSource dataSource; // Step2: Find all relevant shapefiles foreach (var shapefile in CurrentScheme.SchemeShapeCollection) { if (shapefile.Name.Contains("Chamber") || shapefile.Name.Contains("Ghost_Node")) { // Get datasource from the shapefile dataSource = driver.Open(Path.Combine(CopyToSchemePath, shapefile.Name), 0); Layer layer = dataSource.GetLayerByIndex(0); // Get shapefile definition FeatureDefn lyDf = layer.GetLayerDefn(); for (int i = 0; i < lyDf.GetFieldCount(); i++) { FieldDefn fDf = lyDf.GetFieldDefn(i); mergeLy.CreateField(fDf, 1); } // Get Features for (int i = 0; i < layer.GetFeatureCount(1); i++) { Feature outFeature = new Feature(layer.GetLayerDefn()); Feature inFeature = layer.GetNextFeature(); outFeature.SetGeometry(inFeature.GetGeometryRef().Clone()); for (int j = 0; j < layer.GetLayerDefn().GetFieldCount(); j++) { outFeature.SetField(inFeature.GetFieldDefnRef(j).GetNameRef(), inFeature.GetFieldAsString(j)); } mergeLy.CreateFeature(outFeature); mergeLy.SyncToDisk(); } } } }
private static void ReportLayer(Layer layer) { //layer info string layerName = layer.GetName(); //Links string layerName2 = layer.GetLayerDefn().GetName(); //Links int fc = layer.GetFeatureCount(1); //16 Envelope ext = new Envelope(); layer.GetExtent(ext, 1); /* -------------------------------------------------------------------- */ /* Reading the spatial reference */ /* -------------------------------------------------------------------- */ OSGeo.OSR.SpatialReference sr = layer.GetSpatialRef(); string srs_wkt; if (sr != null) { sr.ExportToPrettyWkt(out srs_wkt, 1); } else { srs_wkt = "(unknown)"; } // feature definition FeatureDefn def = layer.GetLayerDefn(); //string layerName2 = def.GetName();//Links /* -------------------------------------------------------------------- */ /* Reading the fields */ /* -------------------------------------------------------------------- */ int nFieldCount = def.GetFieldCount();//3 for (int iField = 0; iField < nFieldCount; iField++) { // field definition FieldDefn fdef = def.GetFieldDefn(iField); // field info string fieldName = fdef.GetName(); //Id Name URL string fieldNameRef = fdef.GetNameRef(); // Id Name URL FieldType fieldType = fdef.GetFieldType(); //OFTInteger OFTString OFTString string fieldTypeName = fdef.GetFieldTypeName(fdef.GetFieldType()); //Integer String String int width = fdef.GetWidth(); //6 50 254 int precision = fdef.GetPrecision(); //0 0 0 } /* -------------------------------------------------------------------- */ /* Reading the shapes */ /* -------------------------------------------------------------------- */ for (int fid = 0; fid < layer.GetFeatureCount(1); fid++) { Feature f = layer.GetFeature(fid); ReportFeature(f, def); f.Dispose(); } //Feature f; //while ((f = layer.GetNextFeature()) != null) //{ // ReportFeature(f, def); // f.Dispose(); //} }
//----------------------------------------------------------------------------------- public void readPoint(ref Layer oLayer) { // 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空 oLayer.ResetReading(); Driver oDriver = null; DataSource oDS = null; Layer newLayer = null; initShp(ref oLayer, ref oDriver, ref oDS, ref newLayer, LAYER_TYPE.POINT); // 获取图层中的属性表表头并输出 string strInfo = "属性表结构信息:\n"; FeatureDefn oDefn = oLayer.GetLayerDefn(); int iFieldCount = oDefn.GetFieldCount(); for (int iAttr = 0; iAttr < iFieldCount; iAttr++) { FieldDefn oField = oDefn.GetFieldDefn(iAttr); FieldType type = oField.GetFieldType(); string fieldName = oField.GetName(); //为新图层创建属性 if (!fieldName.Equals("X坐标") && !fieldName.Equals("Y坐标")) { FieldDefn newField = new FieldDefn(fieldName, type); if (type == FieldType.OFTString) { newField.SetWidth(oField.GetWidth()); } newLayer.CreateField(newField, 1); } //获取图层属性信息 strInfo += string.Format("{0}:{1} ({2}.{3})\n", oField.GetNameRef(), oField.GetFieldTypeName(oField.GetFieldType()), oField.GetWidth(), oField.GetPrecision()); } FeatureDefn newDefn = newLayer.GetLayerDefn(); // 输出图层中的要素个数 strInfo += string.Format("要素个数 = {0}\n", oLayer.GetFeatureCount(0)); Feature oFeature = null; // 下面开始遍历图层中的要素 while ((oFeature = oLayer.GetNextFeature()) != null) { strInfo += string.Format("\n当前处理第{0}个: \n属性值:", oFeature.GetFID()); //为新图层创建要素 Feature oFeaturePoint = new Feature(newDefn); double pointX = 0.0; double pointY = 0.0; // 获取要素中的属性表内容 for (int iField = 0; iField < iFieldCount; iField++) { FieldDefn oFieldDefn = oDefn.GetFieldDefn(iField); FieldType type = oFieldDefn.GetFieldType(); string name = oFieldDefn.GetNameRef(); switch (type) { case FieldType.OFTString: IntPtr pchar = OGR_F_GetFieldAsString(Feature.getCPtr(oFeature), iField); string val = Marshal.PtrToStringAnsi(pchar); oFeaturePoint.SetField(name, val); break; case FieldType.OFTReal: if (!name.Equals("X坐标") && !name.Equals("Y坐标")) { oFeaturePoint.SetField(name, oFeature.GetFieldAsDouble(iField)); } switch (name) { case "X": pointX = oFeature.GetFieldAsDouble(iField); break; case "Y": pointY = oFeature.GetFieldAsDouble(iField); break; default: break; } break; case FieldType.OFTInteger: oFeaturePoint.SetField(iField, oFeature.GetFieldAsInteger(iField)); break; default: oFeaturePoint.SetField(iField, oFeature.GetFieldAsString(iField)); break; } } //填充要素几何信息 Geometry oGeometry = Geometry.CreateFromWkt(string.Format("POINT({0} {1})", pointX, pointY)); oFeaturePoint.SetGeometry(oGeometry); newLayer.CreateFeature(oFeaturePoint); } strInfo += "\n数据集关闭!"; oDS.Dispose(); }
public void testProjectionConvert() { Gdal.AllRegister(); Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); Gdal.SetConfigOption("SHAPE_ENCODING", ""); Ogr.RegisterAll(); Gdal.SetConfigOption("GDAL_DATA", Environment.CurrentDirectory + "//data"); //读取文件 DataSource ds = Ogr.Open(fromPath, 0); Layer oLayer = ds.GetLayerByIndex(0); // 写入文件 OSGeo.OGR.Driver oDriver = Ogr.GetDriverByName("ESRI Shapefile"); OSGeo.OSR.SpatialReference projection = new OSGeo.OSR.SpatialReference(""); projection.ImportFromEPSG(3395); DataSource oDS; if (Ogr.Open(toPath, 0) != null) { oDS = Ogr.Open(toPath, 1); oDS.DeleteLayer(0); } else { oDS = oDriver.CreateDataSource(toPath, null); } Layer toLayer = oDS.CreateLayer("POINT", projection, oLayer.GetGeomType(), null); Random ran = new Random(); Feature oFeature = null; Geometry lines = null; FeatureDefn oDefn = oLayer.GetLayerDefn(); FieldDefn oFieldID = new FieldDefn("HEIGHT_G", FieldType.OFTReal); toLayer.CreateField(oFieldID, 1); FieldDefn oFieldName = new FieldDefn("PWLs", FieldType.OFTReal); toLayer.CreateField(oFieldName, 1); OSGeo.OSR.CoordinateTransformation coordTrans = new OSGeo.OSR.CoordinateTransformation(oLayer.GetSpatialRef(), projection); while ((oFeature = oLayer.GetNextFeature()) != null) { lines = oFeature.GetGeometryRef(); lines.Transform(coordTrans); Feature feature = new Feature(oDefn); feature.SetGeometry(lines); feature.SetField(0, 4.0); feature.SetField(1, ran.Next(40, 120)); toLayer.CreateFeature(feature); } oDS.SyncToDisk(); }
public void readLine(ref Layer oLayer, string pointTableName) { // 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空 oLayer.ResetReading(); //打开数据 DataSource newDs = Ogr.Open(mSrcFile, 0); if (newDs == null) { Console.WriteLine(string.Format("打开文件【{0}】失败!\n", mSrcFile)); return; } //根据图层名称获取相应的图层 Layer matchLayer = newDs.GetLayerByName(pointTableName); Driver oDriver = null; DataSource oDS = null; Layer newLayer = null; initShp(ref oLayer, ref oDriver, ref oDS, ref newLayer, LAYER_TYPE.LINE); // 获取图层中的属性表表头并输出 string strInfo = "属性表结构信息:\n"; FeatureDefn oDefn = oLayer.GetLayerDefn(); int iFieldCount = oDefn.GetFieldCount(); for (int iAttr = 0; iAttr < iFieldCount; iAttr++) { FieldDefn oField = oDefn.GetFieldDefn(iAttr); FieldType type = oField.GetFieldType(); //为新图层创建属性 FieldDefn newField = new FieldDefn(oField.GetNameRef(), type); if (type == FieldType.OFTString) { newField.SetWidth(oField.GetWidth()); } newLayer.CreateField(newField, 1); strInfo += string.Format("{0}:{1} ({2}.{3})\n", oField.GetNameRef(), oField.GetFieldTypeName(oField.GetFieldType()), oField.GetWidth(), oField.GetPrecision()); } FeatureDefn newDefn = newLayer.GetLayerDefn(); // 输出图层中的要素个数 strInfo += string.Format("要素个数 = {0}\n", oLayer.GetFeatureCount(0)); Feature oFeature = null; // 下面开始遍历图层中的要素 double S_X = 0.0; double S_Y = 0.0; double E_X = 0.0; double E_Y = 0.0; while ((oFeature = oLayer.GetNextFeature()) != null) { strInfo += string.Format("\n当前处理第{0}个: \n属性值:", oFeature.GetFID()); //为新图层创建要素 Feature oFeatureLineString = new Feature(newDefn); string sql = string.Empty; // 获取要素中的属性表内容 for (int iField = 0; iField < iFieldCount; iField++) { FieldDefn oFieldDefn = oDefn.GetFieldDefn(iField); string name = oFieldDefn.GetNameRef(); FieldType type = oFieldDefn.GetFieldType(); switch (type) { case FieldType.OFTString: IntPtr pchar = OGR_F_GetFieldAsString(Feature.getCPtr(oFeature), iField); string val = Marshal.PtrToStringAnsi(pchar); oFeatureLineString.SetField(iField, val); switch (name) { case "S_Point": sql = oFeature.GetFieldAsString(iField); getCoordinate(ref matchLayer, ref sql, ref S_X, ref S_Y); break; case "E_Point": sql = oFeature.GetFieldAsString(iField); getCoordinate(ref matchLayer, ref sql, ref E_X, ref E_Y); break; default: break; } break; case FieldType.OFTReal: oFeatureLineString.SetField(name, oFeature.GetFieldAsDouble(iField)); break; case FieldType.OFTInteger: oFeatureLineString.SetField(iField, oFeature.GetFieldAsInteger(iField)); break; default: oFeatureLineString.SetField(iField, oFeature.GetFieldAsString(iField)); break; } } Geometry oGeometry = Geometry.CreateFromWkt(string.Format("LINESTRING({0} {1},{2} {3})", S_X, S_Y, E_X, E_Y)); oFeatureLineString.SetGeometryDirectly(oGeometry); newLayer.CreateFeature(oFeatureLineString); oGeometry.Dispose(); } strInfo += "\n数据集关闭!"; oDS.Dispose(); }
//生成面shp函数 public void surface() { string pszDriverName = "ESRI Shapefile"; OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver poDriver = OSGeo.OGR.Ogr.GetDriverByName(pszDriverName); if (poDriver == null) { MessageBox.Show("Driver Error"); } OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); //用此Driver创建Shape文件//数据源 OSGeo.OGR.DataSource poDS; poDS = poDriver.CreateDataSource("D:\\SHP_TRY", null); if (poDS == null) { MessageBox.Show("DataSource Creation Error"); } // 创建图层,创建一个多边形图层,这里没有指定空间参考,如果需要的话,需要在这里进行指定 Layer oLayer = poDS.CreateLayer("TestPolygon", null, wkbGeometryType.wkbPolygon, null); if (oLayer == null) { MessageBox.Show("图层创建失败!\n"); return; } // 下面创建属性表 // 先创建一个叫FieldID的整型属性 FieldDefn oFieldID = new FieldDefn("FieldID", FieldType.OFTInteger); oLayer.CreateField(oFieldID, 1); // 再创建一个叫FeatureName的字符型属性,字符长度为50 FieldDefn oFieldName = new FieldDefn("FieldName", FieldType.OFTString); oFieldName.SetWidth(100); oLayer.CreateField(oFieldName, 1); FeatureDefn oDefn = oLayer.GetLayerDefn(); // 创建几何图形要素 string CS = ""; string zc = ""; string zj = ""; string start_PT = ""; double x; double y; Feature oFeatureRectangle = new Feature(oDefn); oFeatureRectangle.SetField(0, 1); oFeatureRectangle.SetField(1, "surface"); for (int i = 0; i < 5; i++) { x = i * i; //X,Y是假设的数据,以后可以更加实际坐标点进行填充 y = i + 4; zc = x + " " + y; if (i == 0) { start_PT = zc; //记录第一个坐标 } zj = zj + zc + ","; //坐标之间用“,”隔开 } zj = zj + start_PT; //形成闭合的环 //在POLYGON中添加坐标 CS = "POLYGON ((" + zj + "))"; Geometry geomRectangle = Geometry.CreateFromWkt(CS); oFeatureRectangle.SetGeometry(geomRectangle); oLayer.CreateFeature(oFeatureRectangle); oFeatureRectangle.Dispose(); poDS.Dispose(); MessageBox.Show("生成文件在:D:\\SHP_TRY!"); }
private void WczytajOgrLayer(Layer layer) { List <GeometryFeature> poligony = new List <GeometryFeature>(); List <GeometryFeature> teksty = new List <GeometryFeature>(); FeatureDefn layerDef = layer.GetLayerDefn(); Feature feat = null; while ((feat = layer.GetNextFeature()) != null) { Geometry featGeom = feat.GetGeometryRef(); FeatureDefn featDef = feat.GetDefnRef(); string name = null; string value = null; //pierwsze pole tekstowe for (int i = 0; i < feat.GetFieldCount(); i++) { FieldDefn fdef = featDef.GetFieldDefn(i); if (feat.IsFieldSet(i)) { if (fdef.GetFieldType() == FieldType.OFTString) { name = fdef.GetNameRef(); value = feat.GetFieldAsString(i); break; } } } switch (featGeom.GetGeometryType()) { case wkbGeometryType.wkbPolygon: case wkbGeometryType.wkbPolygon25D: { GeometryFeature geomFeature = new GeometryFeature { Geometry = featGeom.Clone(), Name = name, Value = value }; poligony.Add(geomFeature); } break; case wkbGeometryType.wkbPoint: case wkbGeometryType.wkbPoint25D: { GeometryFeature geomFeature = new GeometryFeature { Geometry = featGeom.Clone(), Name = name, Value = value }; teksty.Add(geomFeature); } break; } feat.Dispose(); } //przypisanie tekstów do poligonów foreach (GeometryFeature gf in poligony) { //przypisz pierwszy tekst zawarty w poligonie foreach (GeometryFeature tf in teksty) { if (gf.Geometry.Contains(tf.Geometry)) { gf.Name = tf.Name; gf.Value = tf.Value; break; } } _geometryLayer.AddFeature(gf); } }
private void button4_Click(object sender, EventArgs e) { string dir_gdal_data = System.Environment.CurrentDirectory + "\\" + "gdal-data\\"; Environment.SetEnvironmentVariable("GDAL_DATA", dir_gdal_data, EnvironmentVariableTarget.Process); DelegateCoordsTransform dele = null; VectorAdjust.CoordinateAdjust ca = new CoordinateAdjust(); //------------WGS84--GCJ02-------------- if (comboBox1.SelectedIndex == 0 && comboBox2.SelectedIndex == 1) { dele = new DelegateCoordsTransform(ca.WGS84ToGCJ02); } //------------GCJ02--WGS84-------------- if (comboBox1.SelectedIndex == 1 && comboBox2.SelectedIndex == 0) { dele = new DelegateCoordsTransform(ca.GCJ02ToWGS84); } //------------WGS84--BD09-------------- if (comboBox1.SelectedIndex == 0 && comboBox2.SelectedIndex == 2) { dele = new DelegateCoordsTransform(ca.WGS84ToBD09); } //------------BD09---WGS84-------------- if (comboBox1.SelectedIndex == 2 && comboBox2.SelectedIndex == 0) { dele = new DelegateCoordsTransform(ca.BD09ToWGS84); } //------------BD09---GCJ02-------------- if (comboBox1.SelectedIndex == 2 && comboBox2.SelectedIndex == 1) { dele = new DelegateCoordsTransform(ca.BD09ToGCJ02); } //------------GCJ02--BD09-------------- if (comboBox1.SelectedIndex == 1 && comboBox2.SelectedIndex == 2) { dele = new DelegateCoordsTransform(ca.GCJ02ToBD09); } if (files == null || files.Length == 0) { MessageBox.Show("请选择要处理的数据"); this.button1.Focus(); return; } if (comboBox1.SelectedIndex == comboBox2.SelectedIndex) { MessageBox.Show("目标坐标系和原始坐标系相同,请重新选择"); return; } if (String.IsNullOrWhiteSpace(textBox2.Text)) { MessageBox.Show("请先选择保存数据目录"); this.button2.Focus(); return; } //初始化驱动信息 //注册所有驱动 Ogr.RegisterAll(); OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); //为支持属性表字段支持中文 OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", ""); //开启日志 Gdal.SetConfigOption("CPL_DEBUG", "ON"); Gdal.SetConfigOption("CPL_LOG", System.IO.Directory.GetCurrentDirectory() + "\\gdallog.txt"); //驱动名称 string strDriverName = "ESRI Shapefile"; OSGeo.OGR.Driver Tdriver = Ogr.GetDriverByName(strDriverName); if (Tdriver == null) { MessageBox.Show("获得驱动失败!程序退出"); return; } //遍历某个图层 this.progressBar1.Maximum = files.Length; this.progressBar1.Minimum = 0; this.progressBar1.Value = 0; for (int i = 0; i < files.Length; i++)//遍历每个图层 { string shp_file = files[i]; string shp_dir = System.IO.Path.GetDirectoryName(shp_file); string shp_fileSaveName = System.IO.Path.GetFileNameWithoutExtension(shp_file); //打开源数据 DataSource dsS = Ogr.Open(shp_file, 0); if (dsS == null) { MessageBox.Show("打开" + shp_file + "文件失败", "提示"); this.progressBar1.Value++; continue; } //创建目标数据 string saveDir = this.textBox2.Text; DataSource dsT = Tdriver.CreateDataSource(saveDir, null); if (dsT == null) { MessageBox.Show("创建" + saveDir + "\\" + shp_fileSaveName + "文件失败"); this.progressBar1.Value++; continue; } Layer layerS = dsS.GetLayerByIndex(0); if (layerS == null) { MessageBox.Show("获得" + shp_file + "图层失败"); this.progressBar1.Value++; continue; } //string shp_fileSaveName_utf8 = TransferEncoding(Encoding.BigEndianUnicode,Encoding.UTF8,shp_fileSaveName); OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); Layer LayerT = dsT.CreateLayer(shp_fileSaveName, layerS.GetSpatialRef(), layerS.GetGeomType(), null);//layerS.GetSpatialRef() if (LayerT == null) { MessageBox.Show("创建" + saveDir + "\\" + shp_fileSaveName + "图层失败!", "提示"); this.progressBar1.Value++; continue; } Feature pFeatureS, pFeatureT; Geometry geomS, geomT; long countFeature = layerS.GetFeatureCount(0); FeatureDefn fd = layerS.GetLayerDefn(); //对目标图层进行属性定义 for (int ii = 0; ii < fd.GetFieldCount(); ii++) { LayerT.CreateField(fd.GetFieldDefn(ii), 1); } fd.Dispose(); this.progressBar2.Minimum = 0; this.progressBar2.Maximum = (int)countFeature; this.progressBar2.Value = 0; for (int k = 0; k < countFeature; k++) { pFeatureS = layerS.GetFeature(k); if (pFeatureS != null) { geomS = pFeatureS.GetGeometryRef(); geomT = GeometryCoordTransfrom2D(geomS, dele); pFeatureT = pFeatureS.Clone(); pFeatureT.SetFrom(pFeatureS, 1); pFeatureT.SetGeometryDirectly(geomT); LayerT.CreateFeature(pFeatureT); geomS.Dispose(); geomT.Dispose(); pFeatureS.Dispose(); pFeatureT.Dispose(); } this.progressBar2.Value++; } layerS.Dispose(); LayerT.Dispose(); dsS.Dispose(); dsT.Dispose(); this.progressBar1.Value++; } MessageBox.Show("处理完毕", "提示"); }
private void WriteVectorFile(string strVectorFile) { SharpMap.GdalConfiguration.ConfigureGdal(); SharpMap.GdalConfiguration.ConfigureOgr(); // 为了支持中文路径,请添加下面这句代码 OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); // 为了使属性表字段支持中文,请添加下面这句 OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", ""); Ogr.RegisterAll(); string strDriverName = "ESRI Shapefile"; Driver oDriver = Ogr.GetDriverByName(strDriverName); if (oDriver == null) { MessageBox.Show("%s 驱动不可用!!\n", strVectorFile); return; } DataSource oDS = oDriver.CreateDataSource(strVectorFile, null); if (oDS == null) { MessageBox.Show("创建矢量文件【%s】失败!\n", strVectorFile); return; } Layer oLayer = oDS.CreateLayer("TestPolygon", null, wkbGeometryType.wkbPolygon, null); if (oLayer == null) { MessageBox.Show("图层创建失败!\n"); return; } //FID FieldDefn oFieldID = new FieldDefn("FID", FieldType.OFTInteger); oLayer.CreateField(oFieldID, 1); //批次 FieldDefn oPCMC = new FieldDefn("PCMC", FieldType.OFTString); oPCMC.SetWidth(100); oLayer.CreateField(oPCMC, 1); //地块号 FieldDefn oDKH = new FieldDefn("DKH", FieldType.OFTString); oDKH.SetWidth(100); oLayer.CreateField(oDKH, 1); //日期 FieldDefn oDate = new FieldDefn("Date", FieldType.OFTString); oDate.SetWidth(10); oLayer.CreateField(oDate, 1); //用地类型 FieldDefn oType = new FieldDefn("Type", FieldType.OFTString); oType.SetWidth(10); oLayer.CreateField(oType, 1); FeatureDefn oDefn = oLayer.GetLayerDefn(); int index = 0; foreach (Data data in DataList) { index++; Feature oFeature = new Feature(oDefn); oFeature.SetField(0, index); oFeature.SetField(1, data.PCMC); oFeature.SetField(2, data.Dkh); oFeature.SetField(3, data.Date); oFeature.SetField(4, data.Type); Geometry geomTriangle = Geometry.CreateFromWkt(GetGeometry(data)); oFeature.SetGeometry(geomTriangle); oLayer.CreateFeature(oFeature); } oDS.Dispose(); MessageBox.Show("生成完毕"); }
/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param> protected override void SolveInstance(IGH_DataAccess DA) { GH_Structure <IGH_GeometricGoo> gGoo = new GH_Structure <IGH_GeometricGoo>(); DA.GetDataTree <IGH_GeometricGoo>("Feature Geometry", out gGoo); GH_Structure <GH_Number> bufferInt = new GH_Structure <GH_Number>(); DA.GetDataTree <GH_Number>("Buffer Distance", out bufferInt); GH_Structure <IGH_GeometricGoo> gGooBuffered = new GH_Structure <IGH_GeometricGoo>(); ///GDAL setup RESTful.GdalConfiguration.ConfigureOgr(); ///Use WGS84 spatial reference OSGeo.OSR.SpatialReference dst = new OSGeo.OSR.SpatialReference(""); dst.SetWellKnownGeogCS("WGS84"); Transform transform = new Transform(1); // Heron.Convert.XYZToWGSTransform(); Transform revTransform = new Transform(1); //Heron.Convert.WGSToXYZTransform(); ///Create virtual datasource to be converted later ///Using geojson as a flexiblle base file type which can be converted later with ogr2ogr OSGeo.OGR.Driver drv = Ogr.GetDriverByName("GeoJSON"); DataSource ds = drv.CreateDataSource("/vsimem/out.geojson", null); ///Use OGR catch-all for geometry types var gtype = wkbGeometryType.wkbGeometryCollection; ///Create layer OSGeo.OGR.Layer layer = ds.CreateLayer("temp", dst, gtype, null); FeatureDefn def = layer.GetLayerDefn(); var branchPaths = gGoo.Paths; for (int a = 0; a < gGoo.Branches.Count; a++) { ///create feature OSGeo.OGR.Feature feature = new OSGeo.OGR.Feature(def); ///Get geometry type(s) in branch var geomList = gGoo.Branches[a]; string geomType = string.Empty; List <string> geomTypeList = geomList.Select(o => o.TypeName).ToList(); ///Test if geometry in the branch is of the same type. ///If there is more than one element of a type, tag as multi, if there is more than one type, tag as mixed if (geomTypeList.Count == 1) { geomType = geomTypeList.First(); } else if (geomTypeList.Count > 1 && geomTypeList.All(gt => gt == geomTypeList.First())) { geomType = "Multi" + geomTypeList.First(); } else { geomType = "Mixed"; } //var buffList = bufferInt.Branches[a]; var buffList = new List <GH_Number>(); //var path = new GH_Path(a); var path = branchPaths[a]; if (path.Valid) { buffList = (List <GH_Number>)bufferInt.get_Branch(path); } else { buffList = bufferInt.Branches[0]; } int buffIndex = 0; double buffDist = 0; GH_Convert.ToDouble(buffList[buffIndex], out buffDist, GH_Conversion.Primary); ///For testing //AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, geomType); ///Add geomtery to feature ///Create containers for translating from GH Goo Point3d pt = new Point3d(); List <Point3d> pts = new List <Point3d>(); Curve crv = null; List <Curve> crvs = new List <Curve>(); Mesh mesh = new Mesh(); Mesh multiMesh = new Mesh(); int quadsecs = 10; switch (geomType) { case "Point": geomList.First().CastTo <Point3d>(out pt); var bufferPt = Heron.Convert.Point3dToOgrPoint(pt, transform).Buffer(buffDist, quadsecs); gGooBuffered.AppendRange(Heron.Convert.OgrGeomToGHGoo(bufferPt, revTransform), new GH_Path(a)); break; case "MultiPoint": foreach (var point in geomList) { point.CastTo <Point3d>(out pt); pts.Add(pt); } var bufferPts = Heron.Convert.Point3dsToOgrMultiPoint(pts, transform).Buffer(buffDist, quadsecs); gGooBuffered.AppendRange(Heron.Convert.OgrGeomToGHGoo(bufferPts, revTransform), new GH_Path(a)); break; case "Curve": geomList.First().CastTo <Curve>(out crv); var bufferCrv = Heron.Convert.CurveToOgrLinestring(crv, transform).Buffer(buffDist, quadsecs); gGooBuffered.AppendRange(Heron.Convert.OgrGeomToGHGoo(bufferCrv, revTransform), new GH_Path(a)); break; case "MultiCurve": bool allClosed = true; foreach (var curve in geomList) { curve.CastTo <Curve>(out crv); if (!crv.IsClosed) { allClosed = false; } crvs.Add(crv); } if (allClosed) { var bufferCrvs = Heron.Convert.CurvesToOgrPolygon(crvs, transform).Buffer(buffDist, quadsecs); gGooBuffered.AppendRange(Heron.Convert.OgrGeomToGHGoo(bufferCrvs, revTransform), new GH_Path(a)); } else { var bufferCrvs = Heron.Convert.CurvesToOgrMultiLinestring(crvs, transform).Buffer(buffDist, quadsecs); gGooBuffered.AppendRange(Heron.Convert.OgrGeomToGHGoo(bufferCrvs, revTransform), new GH_Path(a)); } break; case "Mesh": geomList.First().CastTo <Mesh>(out mesh); mesh.Ngons.AddPlanarNgons(DocumentTolerance()); var bufferPoly = Ogr.ForceToMultiPolygon(Heron.Convert.MeshToMultiPolygon(mesh, transform)).Buffer(buffDist, quadsecs); gGooBuffered.AppendRange(Heron.Convert.OgrGeomToGHGoo(bufferPoly, revTransform), new GH_Path(a)); break; case "MultiMesh": foreach (var m in geomList) { Mesh meshPart = new Mesh(); m.CastTo <Mesh>(out meshPart); meshPart.Ngons.AddPlanarNgons(DocumentTolerance()); multiMesh.Append(meshPart); } var bufferPolys = Ogr.ForceToMultiPolygon(Heron.Convert.MeshToMultiPolygon(multiMesh, transform)).Buffer(buffDist, quadsecs); gGooBuffered.AppendRange(Heron.Convert.OgrGeomToGHGoo(bufferPolys, revTransform), new GH_Path(a)); break; case "Mixed": OSGeo.OGR.Geometry geoCollection = new OSGeo.OGR.Geometry(wkbGeometryType.wkbGeometryCollection); for (int gInt = 0; gInt < geomList.Count; gInt++) { string geomTypeMixed = geomTypeList[gInt]; switch (geomTypeMixed) { case "Point": geomList[gInt].CastTo <Point3d>(out pt); geoCollection.AddGeometry(Heron.Convert.Point3dToOgrPoint(pt, transform)); break; case "Curve": geomList[gInt].CastTo <Curve>(out crv); geoCollection.AddGeometry(Heron.Convert.CurveToOgrLinestring(crv, transform)); break; case "Mesh": geomList[gInt].CastTo <Mesh>(out mesh); geoCollection.AddGeometry(Ogr.ForceToMultiPolygon(Heron.Convert.MeshToMultiPolygon(mesh, transform))); break; default: AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, "Not able to export " + geomType + " geometry at branch " + gGoo.get_Path(a).ToString() + ". Geometry must be a Point, Curve or Mesh."); break; } } var bufferCol = geoCollection.Buffer(buffDist, quadsecs); gGooBuffered.AppendRange(Heron.Convert.OgrGeomToGHGoo(bufferCol, revTransform), new GH_Path(a)); break; default: AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, "Not able to export " + geomType + " geometry at branch " + gGoo.get_Path(a).ToString() + ". Geometry must be a Point, Curve or Mesh."); break; } } def.Dispose(); layer.Dispose(); ds.Dispose(); DA.SetDataTree(0, gGooBuffered); }
public void readLayerTest(string strVectorFile) { Gdal.AllRegister(); //为了支持中文路径,请添加下面这句代码 Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); //为了使属性表字段支持中文,请添加下面这句 Gdal.SetConfigOption("SHAPE_ENCODING", ""); // 注册所有的驱动 Ogr.RegisterAll(); Gdal.SetConfigOption("GDAL_DATA", "E://lib//gdal//gdal1.9//data"); //打开数据 DataSource ds = Ogr.Open(strVectorFile, 0); if (ds == null) { Console.WriteLine("打开文件【{0}】失败!", strVectorFile); return; } Console.WriteLine("打开文件【{0}】成功!", strVectorFile); // 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个 int iLayerCount = ds.GetLayerCount(); // 获取第一个图层 Layer oLayer = ds.GetLayerByIndex(0); String c = ""; oLayer.GetSpatialRef().AutoIdentifyEPSG(); Console.WriteLine(oLayer.GetSpatialRef().AutoIdentifyEPSG()); OSGeo.OSR.SpatialReference spa = oLayer.GetSpatialRef(); // if (spa==null) // { spa = new OSGeo.OSR.SpatialReference(null); spa.ImportFromEPSG(3395); spa.ExportToWkt(out c); Console.WriteLine(c); return; // } // String a = ""; // spa.EPSGTreatsAsLatLong(); // Console.WriteLine(spa.ExportToWkt(out a)); // oLayer.GetSpatialRef().ExportToWkt(out a); // Console.WriteLine(spa.GetProjParm(out a)); // Console.WriteLine(oLayer.GetSpatialRef().GetLinearUnitsName()); if (oLayer == null) { Console.WriteLine("获取第{0}个图层失败!\n", 0); return; } // 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空 oLayer.ResetReading(); // 通过属性表的SQL语句对图层中的要素进行筛选,这部分详细参考SQL查询章节内容 // oLayer.SetAttributeFilter("\"NAME99\"LIKE \"北京市市辖区\""); // 通过指定的几何对象对图层中的要素进行筛选 //oLayer.SetSpatialFilter(); // 通过指定的四至范围对图层中的要素进行筛选 //oLayer.SetSpatialFilterRect(); // 获取图层中的属性表表头并输出 // Console.WriteLine("属性表结构信息:"); FeatureDefn oDefn = oLayer.GetLayerDefn(); int iFieldCount = oDefn.GetFieldCount(); for (int iAttr = 0; iAttr < iFieldCount; iAttr++) { FieldDefn oField = oDefn.GetFieldDefn(iAttr); Console.WriteLine("{0}:{1} ({2}.{3})", oField.GetNameRef(), oField.GetFieldTypeName(oField.GetFieldType()), oField.GetWidth(), oField.GetPrecision()); } // 输出图层中的要素个数 Console.WriteLine("要素个数 = {0}", oLayer.GetFeatureCount(0)); Feature oFeature = null; // 下面开始遍历图层中的要素 while ((oFeature = oLayer.GetNextFeature()) != null) { Console.WriteLine("当前处理第{0}个: \n属性值:", oFeature.GetFID()); // 获取要素中的属性表内容 for (int iField = 0; iField < iFieldCount; iField++) { FieldDefn oFieldDefn = oDefn.GetFieldDefn(iField); FieldType type = oFieldDefn.GetFieldType(); switch (type) { case FieldType.OFTString: Console.WriteLine("{0}\t", oFeature.GetFieldAsString(iField)); break; case FieldType.OFTReal: Console.WriteLine("{0}\t", oFeature.GetFieldAsDouble(iField)); break; case FieldType.OFTInteger: Console.WriteLine("{0}\t", oFeature.GetFieldAsInteger(iField)); break; default: Console.WriteLine("{0}\t", oFeature.GetFieldAsString(iField)); break; } } // 获取要素中的几何体 Geometry oGeometry = oFeature.GetGeometryRef(); // String a=oGeometry.GetGeometryName(); // String b = ""; // oGeometry.ExportToWkt(out b); Console.WriteLine(oGeometry.GetGeometryName()); // 为了演示,只输出一个要素信息 break; } Console.WriteLine("数据集关闭!"); Console.ReadLine(); }
public static void ReportFeature(Feature feat, FeatureDefn def) { Console.WriteLine("Feature(" + def.GetName() + "): " + feat.GetFID()); for (int iField = 0; iField < feat.GetFieldCount(); iField++) { FieldDefn fdef = def.GetFieldDefn(iField); Console.Write(fdef.GetNameRef() + " (" + fdef.GetFieldTypeName(fdef.GetFieldType()) + ") = "); if (feat.IsFieldSet(iField)) { if (fdef.GetFieldType() == FieldType.OFTStringList) { string[] sList = feat.GetFieldAsStringList(iField); foreach (string s in sList) { Console.Write("\"" + s + "\" "); } Console.WriteLine(); } else if (fdef.GetFieldType() == FieldType.OFTIntegerList) { int count; int[] iList = feat.GetFieldAsIntegerList(iField, out count); for (int i = 0; i < count; i++) { Console.Write(iList[i] + " "); } Console.WriteLine(); } else if (fdef.GetFieldType() == FieldType.OFTRealList) { int count; double[] iList = feat.GetFieldAsDoubleList(iField, out count); for (int i = 0; i < count; i++) { Console.Write(iList[i].ToString() + " "); } Console.WriteLine(); } else { Console.WriteLine(feat.GetFieldAsString(iField)); } } else { Console.WriteLine("(null)"); } } if (feat.GetStyleString() != null) { Console.WriteLine(" Style = " + feat.GetStyleString()); } Geometry geom = feat.GetGeometryRef(); if (geom != null) { Console.WriteLine(" " + geom.GetGeometryName() + "(" + geom.GetGeometryType() + ")"); Geometry sub_geom; for (int i = 0; i < geom.GetGeometryCount(); i++) { sub_geom = geom.GetGeometryRef(i); if (sub_geom != null) { Console.WriteLine(" subgeom" + i + ": " + sub_geom.GetGeometryName() + "(" + sub_geom.GetGeometryType() + ")"); } } Envelope env = new Envelope(); geom.GetEnvelope(env); Console.WriteLine(" ENVELOPE: " + env.MinX + "," + env.MaxX + "," + env.MinY + "," + env.MaxY); string geom_wkt; geom.ExportToWkt(out geom_wkt); Console.WriteLine(" " + geom_wkt); } Console.WriteLine(""); }
public bool GetFieldContent(int index, List <MField> fieldList) { Feature oFeature = null; if ((oFeature = oLayer.GetFeature(index)) != null) { FeatureDefn oDefn = oLayer.GetLayerDefn(); int iFieldCount = oDefn.GetFieldCount(); // 查找字段属性 for (int i = 0; i < iFieldCount; i++) { FieldDefn oField = oDefn.GetFieldDefn(i); string sFeildName = oField.GetNameRef(); #region 获取属性字段 FieldType Ftype = oFeature.GetFieldType(sFeildName); string sTempType = ""; MField mField = new MField(); switch (Ftype) { case FieldType.OFTString: string sFValue = oFeature.GetFieldAsString(sFeildName); sTempType = "string"; mField.fieldValue = sFValue; mField.fieldName = mFiledList[i]; fieldList.Add(mField); break; case FieldType.OFTReal: double dFValue = oFeature.GetFieldAsDouble(sFeildName); sTempType = "float"; mField.fieldValue = dFValue.ToString(); mField.fieldName = mFiledList[i]; fieldList.Add(mField); break; case FieldType.OFTInteger: int iFValue = oFeature.GetFieldAsInteger(sFeildName); sTempType = "int"; mField.fieldValue = iFValue.ToString(); mField.fieldName = mFiledList[i]; fieldList.Add(mField); break; case FieldType.OFTInteger64: long lFValue = oFeature.GetFieldAsInteger64(sFeildName); sTempType = "long"; mField.fieldValue = lFValue.ToString(); mField.fieldName = mFiledList[i]; fieldList.Add(mField); break; case FieldType.OFTDate: int year = 0, month = 0, day = 0, hour = 0, minute = 0, flag = 0; float second = 0; oFeature.GetFieldAsDateTime(sFeildName, out year, out month, out day, out hour, out minute, out second, out flag); DateTime dt = new DateTime(year, month, day, hour, minute, (int)second); sTempType = "datetime"; mField.fieldValue = dt.ToString(); mField.fieldName = mFiledList[i]; fieldList.Add(mField); break; default: //System.Console.WriteLine("error!"); break; } #endregion } } return(true); }
// string toPath = "E:\\test\\workspace\\temp\\staticPartitionpX.shp"; public void testStaticPartition() { Gdal.AllRegister(); Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); Gdal.SetConfigOption("SHAPE_ENCODING", ""); Ogr.RegisterAll(); //读取文件 DataSource ds = Ogr.Open(fromPath, 0); Layer oLayer = ds.GetLayerByIndex(0); // 写入文件 OSGeo.OGR.Driver oDriver = Ogr.GetDriverByName("ESRI Shapefile"); // 创建数据源 DataSource oDS; if (Ogr.Open(toPath, 0) != null) { oDS = Ogr.Open(toPath, 1); oDS.DeleteLayer(0); } else { oDS = oDriver.CreateDataSource(toPath, null); } Layer toLayer = oDS.CreateLayer("POINT", oLayer.GetSpatialRef(), wkbGeometryType.wkbPoint, null); Random ran = new Random(); Feature oFeature = null; Geometry lines = null; FeatureDefn oDefn = oLayer.GetLayerDefn(); FieldDefn oFieldID = new FieldDefn("HEIGHT_G", FieldType.OFTReal); toLayer.CreateField(oFieldID, 1); FieldDefn oFieldName = new FieldDefn("PWLs", FieldType.OFTReal); toLayer.CreateField(oFieldName, 1); while ((oFeature = oLayer.GetNextFeature()) != null) { //read current feature lines = oFeature.GetGeometryRef(); Queue <Geometry> LineSource = bean.staticPartition(10, lines); Geometry line = null; Geometry linex = null; while (LineSource.Count > 0) { if (line == null) { line = LineSource.Dequeue(); } if (LineSource.Count > 0) { linex = LineSource.Dequeue(); if (line.Centroid().Distance(linex.Centroid()) >= 9) { Feature feature = new Feature(oDefn); feature.SetGeometry(line.Centroid()); feature.SetField(0, 4.0); feature.SetField(1, ran.Next(40, 120)); toLayer.CreateFeature(feature); line = linex; } } } } oDS.SyncToDisk(); }
private void button2_Click(object sender, EventArgs e) { OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); // 为了使属性表字段支持中文,请添加下面这句 OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", ""); string strVectorFile = "H:\\GDAL\\中国省级行政区划_shp"; // 注册所有的驱动 Ogr.RegisterAll(); //创建数据,这里以创建ESRI的shp文件为例 string strDriverName = "ESRI Shapefile"; int count = Ogr.GetDriverCount(); Driver oDriver = Ogr.GetDriverByName(strDriverName); if (oDriver == null) { Console.WriteLine("%s 驱动不可用!\n", strVectorFile); return; } // 创建数据源 DataSource oDS = oDriver.CreateDataSource(strVectorFile, null); if (oDS == null) { Console.WriteLine("创建矢量文件【%s】失败!\n", strVectorFile); return; } // 创建图层,创建一个多边形图层,这里没有指定空间参考,如果需要的话,需要在这里进行指定 Layer oLayer = oDS.CreateLayer("TestPolygon", null, wkbGeometryType.wkbPolygon, null); if (oLayer == null) { Console.WriteLine("图层创建失败!\n"); return; } // 下面创建属性表 // 先创建一个叫FieldID的整型属性 FieldDefn oFieldID = new FieldDefn("FieldID", FieldType.OFTInteger); oLayer.CreateField(oFieldID, 1); // 再创建一个叫FeatureName的字符型属性,字符长度为50 FieldDefn oFieldName = new FieldDefn("FieldName", FieldType.OFTString); oFieldName.SetWidth(100); oLayer.CreateField(oFieldName, 1); FeatureDefn oDefn = oLayer.GetLayerDefn(); // 创建三角形要素 Feature oFeatureTriangle = new Feature(oDefn); oFeatureTriangle.SetField(0, 0); oFeatureTriangle.SetField(1, "三角形"); Geometry geomTriangle = Geometry.CreateFromWkt("POLYGON ((0 0,20 0,10 15,0 0))"); oFeatureTriangle.SetGeometry(geomTriangle); oLayer.CreateFeature(oFeatureTriangle); // 创建矩形要素 Feature oFeatureRectangle = new Feature(oDefn); oFeatureRectangle.SetField(0, 1); oFeatureRectangle.SetField(1, "矩形"); Geometry geomRectangle = Geometry.CreateFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))"); oFeatureRectangle.SetGeometry(geomRectangle); oLayer.CreateFeature(oFeatureRectangle); // 创建岛要素 Feature oFeatureHole = new Feature(oDefn); oFeatureHole.SetField(0, 1); oFeatureHole.SetField(1, "环岛测试"); //Geometry geomWYX = Geometry.CreateFromWkt("POLYGON ((30 0,60 0,60 30,30 30,30 0))"); OSGeo.OGR.Geometry outGeo = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing); outGeo.AddPoint(40, -30, 0); outGeo.AddPoint(60, -30, 0); outGeo.AddPoint(60, -10, 0); outGeo.AddPoint(40, -10, 0); OSGeo.OGR.Geometry inGeo = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing); inGeo.AddPoint(45, -25, 0); inGeo.AddPoint(55, -25, 0); inGeo.AddPoint(55, -15, 0); inGeo.AddPoint(45, -15, 0); OSGeo.OGR.Geometry geo = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPolygon); geo.AddGeometryDirectly(outGeo); geo.AddGeometryDirectly(inGeo); oFeatureHole.SetGeometry(geo); oLayer.CreateFeature(oFeatureHole); // 创建Multi要素 Feature oFeatureMulty = new Feature(oDefn); oFeatureMulty.SetField(0, 1); oFeatureMulty.SetField(1, "MultyPart测试"); OSGeo.OGR.Geometry geo1 = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing); geo1.AddPoint(25, -10, 0); geo1.AddPoint(5, -10, 0); geo1.AddPoint(5, -30, 0); geo1.AddPoint(25, -30, 0); OSGeo.OGR.Geometry poly1 = new Geometry(wkbGeometryType.wkbPolygon); poly1.AddGeometryDirectly(geo1); OSGeo.OGR.Geometry geo2 = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing); geo2.AddPoint(0, -15, 0); geo2.AddPoint(-5, -15, 0); geo2.AddPoint(-5, -20, 0); geo2.AddPoint(0, -20, 0); OSGeo.OGR.Geometry poly2 = new Geometry(wkbGeometryType.wkbPolygon); poly2.AddGeometryDirectly(geo2); OSGeo.OGR.Geometry geoMulty = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbMultiPolygon); geoMulty.AddGeometryDirectly(poly1); geoMulty.AddGeometryDirectly(poly2); oFeatureMulty.SetGeometry(geoMulty); oLayer.CreateFeature(oFeatureMulty); Console.WriteLine("\n数据集创建完成!\n"); }