/// <summary> /// 标准差 /// </summary> /// <param name="dzxLayer"></param> /// <param name="aue"></param> /// <param name="bzc"></param> public static void getBZC(OSGeo.OGR.Layer dzxLayer, out double aue, out double bzc) { //获取Featuer数 int featCount = dzxLayer.GetFeatureCount(0); // 1 拿到每个Featuer的Value double[] values = new double[featCount]; for (int i = 0; i < featCount; i++) { OSGeo.OGR.Feature fileFeat = dzxLayer.GetFeature(i); values[i] = fileFeat.GetFieldAsDouble("EVE"); fileFeat.Dispose(); } // 2 求Values的平均值 aue = values.Average(); // 3 求values与平均值差的平方和 double pingFangHe = 0; for (int i = 0; i < featCount; i++) { pingFangHe += (values[i] - aue) * (values[i] - aue); } // 4 每个值与平均值的差相加,除Featuer数.再开方,得到标准差 bzc = Math.Sqrt(pingFangHe / featCount); }
public static object GetFieldValue(this OSGeo.OGR.Feature feature, string fieldName) { if (feature == null || string.IsNullOrEmpty(fieldName)) { throw new Exception("参数设置错误"); } using var fieldDefn = feature.GetFieldDefnRef(fieldName); object value; switch (fieldDefn.GetFieldType()) { case OSGeo.OGR.FieldType.OFTString: value = feature.GetFieldAsString(fieldName); break; case OSGeo.OGR.FieldType.OFTInteger: value = feature.GetFieldAsInteger(fieldName); break; case OSGeo.OGR.FieldType.OFTInteger64: value = feature.GetFieldAsInteger64(fieldName); break; case OSGeo.OGR.FieldType.OFTReal: value = feature.GetFieldAsDouble(fieldName); break; default: throw new NotImplementedException(); } return(value); }
private static void _标准差(string dzx, out double aue, out double bzc) { OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); OSGeo.OGR.DataSource dzxDS = dr.Open(dzx, 0); OSGeo.OGR.Layer dzxLayer = dzxDS.GetLayerByIndex(0); //获取Featuer数 int featCount = dzxLayer.GetFeatureCount(0); // 1 拿到每个Featuer的Value double[] values = new double[featCount]; for (int i = 0; i < featCount; i++) { OSGeo.OGR.Feature fileFeat = dzxLayer.GetFeature(i); OSGeo.OGR.Geometry fileGeom = fileFeat.GetGeometryRef(); values[i] = fileFeat.GetFieldAsDouble("EVE"); fileGeom.Dispose(); fileFeat.Dispose(); } dzxDS.Dispose(); // 2 求Values的平均值 aue = values.Average(); // 3 求values与平均值差的平方和 double pingFangHe = 0; for (int i = 0; i < featCount; i++) { pingFangHe += (values[i] - aue) * (values[i] - aue); } // 4 每个值与平均值的差相加,除Featuer数.再开方,得到标准差 bzc = Math.Sqrt(pingFangHe / featCount); }
public static object GetFieldValue(this OSGeo.OGR.Feature feature, int index) { if (feature == null || index < 0 || index >= feature.GetFieldCount()) { throw new Exception("参数设置错误"); } using var fieldDefn = feature.GetFieldDefnRef(index); object value; switch (fieldDefn.GetFieldType()) { case OSGeo.OGR.FieldType.OFTString: value = feature.GetFieldAsString(index); break; case OSGeo.OGR.FieldType.OFTInteger: value = feature.GetFieldAsInteger(index); break; case OSGeo.OGR.FieldType.OFTInteger64: value = feature.GetFieldAsInteger64(index); break; case OSGeo.OGR.FieldType.OFTReal: value = feature.GetFieldAsDouble(index); break; default: throw new NotImplementedException(); } return(value); }
/// <summary> /// 通过线长,值 清理等值线 /// </summary> /// <param name="dzx"></param> /// <returns></returns> static OSGeo.OGR.Layer cleanDZX(OSGeo.OGR.Layer dzxLayer) { //创建poly层 shpDataSet.deleteLayerByName("dzPoly"); OSGeo.OGR.Layer newdzxLayer = shpDataSet.CreateLayer("dzPoly", dzxLayer.GetSpatialRef(), OSGeo.OGR.wkbGeometryType.wkbPolygon, null); //aue平均值,bzc标准差 double aue, bzc; StaticTools.getBZC(dzxLayer, out aue, out bzc); //清理过大和过小的高度值,取值范围为平均值两则,2倍的标准差,约为95.4% double minValue = aue - bzc * sec; double maxValue = aue + bzc * sec; int FeatureCount = dzxLayer.GetFeatureCount(0); StaticTools.msgLine("cleanDZX..."); for (int i = 0; i < FeatureCount; i++) { OSGeo.OGR.Feature fileFeat = dzxLayer.GetFeature(i); OSGeo.OGR.Geometry fileGeom = fileFeat.GetGeometryRef(); if (fileGeom.IsRing() &&//判断闭合 fileFeat.GetFieldAsDouble("EVE") > minValue && fileFeat.GetFieldAsDouble("EVE") < maxValue && //判断值 fileGeom.Length() > minLength && fileGeom.Length() < maxLength) //判断长度 { OSGeo.OGR.Feature newFeat = polyFeat(fileGeom); newdzxLayer.CreateFeature(newFeat); StaticTools.progress((i + 1) * 100 / FeatureCount, $"{i} / {FeatureCount}"); } } StaticTools.progress(100); if (IsDelete) { shpDataSet.deleteLayerByName(dzxLayer.GetName()); } return(newdzxLayer); }
/************************************** 清理等值线 *****************************************/ /// <summary> /// 通过线长,值 清理等值线 /// </summary> /// <param name="filePath"></param> public static string cleanDS(string dzx) { Console.WriteLine("开始清理等值线!"); double aue, bzc; _标准差(dzx, out aue, out bzc); double minLength = 50; double maxLength = 2600; double minValue = aue - bzc * 2; double maxValue = aue + bzc * 2; //open dzx OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); OSGeo.OGR.DataSource dzxDS = dr.Open(dzx, 0); OSGeo.OGR.Layer dzxLayer = dzxDS.GetLayerByIndex(0); //new a shp string cleanline = StaticTools.tempFilePath("shp", "清理后的等值线"); OSGeo.OGR.DataSource newdzxDS = dr.CreateDataSource(cleanline, null); OSGeo.OGR.Layer newdzxLayer = newdzxDS.CreateLayer(dzxLayer.GetName(), dzxLayer.GetSpatialRef(), dzxLayer.GetGeomType(), null); for (int i = 0; i < dzxLayer.GetFeatureCount(0); i++) { OSGeo.OGR.Feature fileFeat = dzxLayer.GetFeature(i); OSGeo.OGR.Geometry fileGeom = fileFeat.GetGeometryRef(); double FeatLength = fileGeom.Length(); bool s1 = FeatLength > minLength && FeatLength < maxLength; double featValue = fileFeat.GetFieldAsDouble("EVE"); bool s2 = featValue > minValue && featValue < maxValue; bool isR = fileGeom.IsRing(); if (s1 && s2 && isR) { newdzxLayer.CreateFeature(fileFeat); } fileFeat.Dispose(); } newdzxDS.Dispose(); dzxDS.Dispose(); Console.WriteLine("清理等值线完成!"); return(cleanline); }
/// <summary> /// Get value from Ogr feature /// </summary> /// <param name="feature">Ogr feature</param> /// <param name="i">Field index</param> /// <returns>Value</returns> public static object GetOgrValue(OSGeo.OGR.Feature feature, int i) { switch (feature.GetFieldDefnRef(i).GetFieldType()) { case OSGeo.OGR.FieldType.OFTString: return(feature.GetFieldAsString(i)); case OSGeo.OGR.FieldType.OFTInteger: return(feature.GetFieldAsInteger(i)); case OSGeo.OGR.FieldType.OFTDateTime: return(GetFieldAsDateTime(feature, i)); case OSGeo.OGR.FieldType.OFTReal: return(feature.GetFieldAsDouble(i)); default: return(null); } }
//private static Geometry ParseOgrGeometry(OgrGeometry ogrGeometry, WKBReader reader) ////private static Geometry ParseOgrGeometry(OgrGeometry ogrGeometry, IGeometryFactory factory) //{ // if (ogrGeometry != null) // { // //Just in case it isn't 2D // ogrGeometry.FlattenTo2D(); // var wkbBuffer = new byte[ogrGeometry.WkbSize()]; // ogrGeometry.ExportToWkb(wkbBuffer); // //var geom = GeometryFromWKB.Parse(wkbBuffer, factory); // var geom = reader.Read(wkbBuffer); // if (geom == null) // _log.Debug(t=> t("Failed to parse '{0}'", ogrGeometry.GetGeometryType())); // return geom; // ogrGeometry.GetGeometry() // } // return null; //} //private static FeatureDataRow LoadOgrFeatureToFeatureDataRow(FeatureDataTable table, OSGeo.OGR.Feature ogrFeature, GeoAPI.Geometries.IGeometryFactory factory) private static FeatureDataRow LoadOgrFeatureToFeatureDataRow(FeatureDataTable table, OSGeo.OGR.Feature ogrFeature, OgrGeometryReader reader) { var values = new object[ogrFeature.GetFieldCount()]; for (var iField = 0; iField < ogrFeature.GetFieldCount(); iField++) { // No need to get field value if there's no value available... if (!ogrFeature.IsFieldSet(iField)) { continue; } int count; switch (ogrFeature.GetFieldType(iField)) { case OgrFieldType.OFTString: case OgrFieldType.OFTWideString: values[iField] = ogrFeature.GetFieldAsString(iField); break; case OgrFieldType.OFTStringList: case OgrFieldType.OFTWideStringList: values[iField] = ogrFeature.GetFieldAsStringList(iField); break; case OgrFieldType.OFTInteger: values[iField] = ogrFeature.GetFieldAsInteger(iField); break; case OgrFieldType.OFTIntegerList: values[iField] = ogrFeature.GetFieldAsIntegerList(iField, out count); break; case OgrFieldType.OFTReal: values[iField] = ogrFeature.GetFieldAsDouble(iField); break; case OgrFieldType.OFTRealList: values[iField] = ogrFeature.GetFieldAsDoubleList(iField, out count); break; case OgrFieldType.OFTDate: case OgrFieldType.OFTDateTime: case OgrFieldType.OFTTime: Int32 y, m, d, h, mi, tz; float s; ogrFeature.GetFieldAsDateTime(iField, out y, out m, out d, out h, out mi, out s, out tz); try { if (y == 0 && m == 0 && d == 0) { values[iField] = DateTime.MinValue.AddMinutes(h * 60 + mi); } else { values[iField] = new DateTime(y, m, d, h, mi, (int)s); } } // ReSharper disable once EmptyGeneralCatchClause catch { } break; default: var iTmpField = iField; _log.Debug(t => t("Cannot handle Ogr DataType '{0}'", ogrFeature.GetFieldType(iTmpField))); break; } } var fdr = (FeatureDataRow)table.LoadDataRow(values, true); using (var gr = ogrFeature.GetGeometryRef()) { //fdr.Geometry = ParseOgrGeometry(gr, factory); fdr.Geometry = reader.Read(gr); } return(fdr); }
private static FeatureDataRow OgrFeatureToFeatureDataRow(FeatureDataTable table, OSGeo.OGR.Feature ogrFeature, GeoAPI.Geometries.IGeometryFactory factory) { FeatureDataRow fdr = table.NewRow(); Int32 fdrIndex = 0; for (int iField = 0; iField < ogrFeature.GetFieldCount(); iField++) { //*** BEGIN FIX: Ensure fdrIndex is incremented if field value is not set and field is of a supported type. bool valueAvailable = ogrFeature.IsFieldSet(iField); OgrFieldType fieldType = ogrFeature.GetFieldType(iField); // No need to get field value if there's no value available... if (!valueAvailable) { // We need to increment the data row column index if this is a supported field type // otherwise the next field will be written to the wrong column... // We support all types except OFTBinary... // Supported field types must be consistent with the code in ReadColumnDefinition and the switch case below... if (fieldType != OgrFieldType.OFTBinary) { fdrIndex++; } continue; } //*** END FIX //if (!ogrFeature.IsFieldSet(iField)) continue; try { switch (ogrFeature.GetFieldType(iField)) { case OgrFieldType.OFTString: case OgrFieldType.OFTWideString: { fdr[fdrIndex++] = ogrFeature.GetFieldAsString(iField); break; } case OgrFieldType.OFTStringList: case OgrFieldType.OFTWideStringList: { fdr[fdrIndex++] = ogrFeature.GetFieldAsStringList(iField); break; } case OgrFieldType.OFTInteger: { fdr[fdrIndex++] = ogrFeature.GetFieldAsInteger(iField); break; } case OgrFieldType.OFTIntegerList: { int count = 0; fdr[fdrIndex++] = ogrFeature.GetFieldAsIntegerList(iField, out count); break; } case OgrFieldType.OFTReal: { fdr[fdrIndex++] = ogrFeature.GetFieldAsDouble(iField); break; } case OgrFieldType.OFTRealList: { int count = 0; fdr[fdrIndex++] = ogrFeature.GetFieldAsDoubleList(iField, out count); break; } case OgrFieldType.OFTDate: case OgrFieldType.OFTDateTime: case OgrFieldType.OFTTime: Int32 y, m, d, h, mi, s, tz; ogrFeature.GetFieldAsDateTime(iField, out y, out m, out d, out h, out mi, out s, out tz); try { if (y == 0 && m == 0 && d == 0) { fdr[fdrIndex++] = DateTime.MinValue.AddMinutes(h * 60 + mi); } else { fdr[fdrIndex++] = new DateTime(y, m, d, h, mi, s); } } catch { throw; } break; default: Debug.WriteLine(string.Format("Cannot handle Ogr DataType '{0}', '{1}'", ogrFeature.GetFieldType(iField), iField)); break; } } catch { } } using (var gr = ogrFeature.GetGeometryRef()) { fdr.Geometry = ParseOgrGeometry(gr, factory); gr.Dispose(); } return(fdr); }
private static FeatureDataRow OgrFeatureToFeatureDataRow(FeatureDataTable table, OSGeo.OGR.Feature ogrFeature, GeoAPI.Geometries.IGeometryFactory factory) { FeatureDataRow fdr = table.NewRow(); Int32 fdrIndex = 0; for (int iField = 0; iField < ogrFeature.GetFieldCount(); iField++) { if (!ogrFeature.IsFieldSet(iField)) { continue; } switch (ogrFeature.GetFieldType(iField)) { case OgrFieldType.OFTString: case OgrFieldType.OFTWideString: fdr[fdrIndex++] = ogrFeature.GetFieldAsString(iField); break; case OgrFieldType.OFTStringList: case OgrFieldType.OFTWideStringList: break; case OgrFieldType.OFTInteger: fdr[fdrIndex++] = ogrFeature.GetFieldAsInteger(iField); break; case OgrFieldType.OFTIntegerList: break; case OgrFieldType.OFTReal: fdr[fdrIndex++] = ogrFeature.GetFieldAsDouble(iField); break; case OgrFieldType.OFTRealList: break; case OgrFieldType.OFTDate: case OgrFieldType.OFTDateTime: case OgrFieldType.OFTTime: Int32 y, m, d, h, mi, s, tz; ogrFeature.GetFieldAsDateTime(iField, out y, out m, out d, out h, out mi, out s, out tz); try { if (y == 0 && m == 0 && d == 0) { fdr[fdrIndex++] = DateTime.MinValue.AddMinutes(h * 60 + mi); } else { fdr[fdrIndex++] = new DateTime(y, m, d, h, mi, s); } } catch { } break; default: Debug.WriteLine(string.Format("Cannot handle Ogr DataType '{0}'", ogrFeature.GetFieldType(iField))); break; } } using (var gr = ogrFeature.GetGeometryRef()) { fdr.Geometry = ParseOgrGeometry(gr, factory); gr.Dispose(); } return(fdr); }
/// <summary> /// 以前的代码 /// </summary> /// <param name="dsmDs"></param> /// <param name="oriFeat"></param> /// <param name="bufFeat"></param> /// <param name="subRasterOff_Size"></param> private static void getMaxMinValue_(OSGeo.GDAL.Dataset dsmDs, OSGeo.OGR.Feature oriFeat, OSGeo.OGR.Feature bufFeat, int[] subRasterOff_Size) { //拿到当前Feature对应的栅格值(数组) double[] rastValue = new double[subRasterOff_Size[2] * subRasterOff_Size[3]]; //拿到全局Transfrom double[] Transfrom = new double[6]; dsmDs.GetGeoTransform(Transfrom); //把SUBimg的值读进数组 dsmDs.GetRasterBand(1).ReadRaster( subRasterOff_Size[0], subRasterOff_Size[1], subRasterOff_Size[2], subRasterOff_Size[3], rastValue, subRasterOff_Size[2], subRasterOff_Size[3], 0, 0); OSGeo.OGR.Geometry oriGeom = oriFeat.GetGeometryRef(); string ddd = oriFeat.GetFieldAsString("MAX"); while (oriFeat.GetFieldAsString("MAX") == "") { //拿到数组中最大值的索引 int maxId = Array.IndexOf(rastValue, rastValue.Max()); //通过索引拿到空间坐标 double maxX, maxY; StaticTools.indexToGeoSpace(maxId, subRasterOff_Size, Transfrom, out maxX, out maxY); //把空间坐标写进Geomtry OSGeo.OGR.Geometry maxGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPoint); maxGeom.AddPoint_2D(maxX, maxY); //判断坐标是否在Feature中,在则把值写入对应字段,不在则把当前值改为平均值 if (maxGeom.Within(oriGeom)) { oriFeat.SetField("MAX", rastValue.Max()); } else { rastValue[maxId] = rastValue.Average(); } } string dd = oriFeat.GetFieldAsString("MIN"); while (oriFeat.GetFieldAsString("MIN") == "") { //拿到数组中最小值的索引 double ffdf = rastValue.Min(); int minId = Array.IndexOf(rastValue, rastValue.Min()); //通过索引拿到空间坐标 double minX, minY; StaticTools.indexToGeoSpace(minId, subRasterOff_Size, Transfrom, out minX, out minY); //把空间坐标写进Geomtry OSGeo.OGR.Geometry minGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPoint); minGeom.AddPoint_2D(minX, minY); //判断坐标是否在Feature中,在则把值写入对应字段,不在则把当前值改为平均值 OSGeo.OGR.Geometry bufGeom = bufFeat.GetGeometryRef(); if (minGeom.Within(bufGeom)) { oriFeat.SetField("MIN", rastValue.Min()); } else { rastValue[minId] = rastValue.Average(); } } double max = oriFeat.GetFieldAsDouble("MAX"); double min = oriFeat.GetFieldAsDouble("MIN"); oriFeat.SetField("HIGHT", max - min); }