private static void TKDataF(OSGeo.OGR.Layer slopePolyLayer, int index) { double[] geoTansform = new double[6]; dsmDataset.GetGeoTransform(geoTansform); int xTimes = (dsm_Xsize - 300) / 500; int xRemainder = (dsm_Xsize - 300) % 500; int yTimes = (dsm_Ysize - 300) / 500; int yRemainder = (dsm_Ysize - 300) % 500; int ax = xTimes, by = yTimes; if (xRemainder > 10) { ax++; } int x = index % ax; int y = index / ax; int xsize = 800, ysize = 800; if (x * 500 + 800 > dsm_Xsize) { xsize = dsm_Xsize - x * 500; } if (y * 500 + 800 > dsm_Ysize) { ysize = dsm_Ysize - y * 500; } double[] buffer = new double[xsize * ysize]; double[] slopebuffer = new double[xsize * ysize]; dsmDataset.GetRasterBand(1).ReadRaster(x * 500, y * 500, xsize, ysize, buffer, xsize, ysize, 0, 0); slopeDataSet.GetRasterBand(1).ReadRaster(x * 500, y * 500, xsize, ysize, slopebuffer, xsize, ysize, 0, 0); BasicUnit bUnit = new BasicUnit(x * 500, y * 500, xsize, ysize, ImprotLevel, buffer, slopebuffer, geoTansform, imgNodata); List <OSGeo.OGR.Geometry> geolist = bUnit.Identify2(); lock (slopePolyLayer) { foreach (OSGeo.OGR.Geometry item in geolist) { if (item.GetGeometryType() == OSGeo.OGR.wkbGeometryType.wkbPolygon25D || item.GetGeometryType() == OSGeo.OGR.wkbGeometryType.wkbPolygon) { OSGeo.OGR.Feature oFea = new OSGeo.OGR.Feature(slopePolyLayer.GetLayerDefn()); oFea.SetGeometry(item); slopePolyLayer.CreateFeature(oFea); } } } }
private void labDSMin_TextChanged(object sender, EventArgs e) { if (labDSMin.Text != "") { OSGeo.GDAL.Gdal.AllRegister(); OSGeo.GDAL.Dataset ds = OSGeo.GDAL.Gdal.Open(labDSMin.Text, OSGeo.GDAL.Access.GA_ReadOnly); double[] a = new double[6]; ds.GetGeoTransform(a); double xx = a[0]; double yy = a[3]; double size = a[1]; double xSixe = ds.RasterXSize; double ySixe = ds.RasterYSize; labInFileInfo.Text += labDSMin.Text + ":\r" + "\r\n" + "左上角X坐标:" + xx.ToString() + "\r" + "左上角Y坐标:" + yy.ToString() + "\r" + "像元尺寸:" + size.ToString() + "\r" + "图像大小:" + xSixe.ToString() + "*" + ySixe.ToString(); ds.Dispose(); } else { labInFileInfo.Text = ""; } }
/// <summary> /// Initialise ImageStore with a GDAL dataset /// </summary> /// <param name="dataset">Dataset in EPSG:4326</param> public GDALImageStore( string dataSetName, string sourcefilename, OSGeo.GDAL.Dataset dataset, string format) { //TODO: Allow serialization and deserialization of this class for persistency m_dataSetName = dataSetName; m_dataset = dataset; m_sourcefilename = sourcefilename; dataset.GetGeoTransform(m_transform); m_lines = dataset.RasterYSize; m_pixels = dataset.RasterXSize; m_imageFileExtension = "png"; m_bands = dataset.RasterCount; if (format.Equals("jpg")) { m_imageFileExtension = "jpg"; //m_tileformat = ImageFileFormat.Jpg; } else if (format.Equals("bmp")) { m_imageFileExtension = "bmp"; //m_tileformat = ImageFileFormat.Bmp; } else if (format.Equals("dds")) { m_imageFileExtension = "dds"; //m_tileformat = ImageFileFormat.Dds; } }
/// <summary> /// Constructor /// </summary> /// <param name="gdalDataSet">The gdal data set</param> public GeoTransform(OSGeo.GDAL.Dataset gdalDataSet) { if (gdalDataSet == null) { throw new ArgumentException("GeoTransform constructor invoked with null dataset.", nameof(gdalDataSet)); } gdalDataSet.GetGeoTransform(_transform); ComputeInverse(); }
/// <summary> /// Constructor /// </summary> /// <param name="gdalDataset">The gdal dataset</param> public GeoTransform(OSGeo.GDAL.Dataset gdalDataset) { if (gdalDataset == null) { throw new ArgumentException("GeoTransform constructor invoked with null dataset.", "gdalDataset"); } var array = new double[6]; gdalDataset.GetGeoTransform(array); _transform = array; ComputeInverse(); }
private SharpMap.Geometries.BoundingBox GetExtent() { if (_GdalDataset != null) { double[] geoTrans = new double[6]; _GdalDataset.GetGeoTransform(geoTrans); GeoTransform GT = new GeoTransform(geoTrans); return(new SharpMap.Geometries.BoundingBox(GT.Left, GT.Top + (GT.VerticalPixelResolution * _GdalDataset.RasterYSize), GT.Left + (GT.HorizontalPixelResolution * _GdalDataset.RasterXSize), GT.Top)); } return(null); }
public void LoadAffineTransform(string filename) { using (OSGeo.GDAL.Dataset dataset = OSGeo.GDAL.Gdal.Open(filename, OSGeo.GDAL.Access.GA_ReadOnly)) { AffineTransform = new double[6]; dataset.GetGeoTransform(AffineTransform); string targetProjection = "GEOGCS[\"Moon 2000\", DATUM[\"D_Moon_2000\", SPHEROID[\"Moon_2000_IAU_IAG\",1737400.0,0.0]], PRIMEM[\"Greenwich\",0], UNIT[\"Decimal_Degree\",0.0174532925199433]]"; var src = new OSGeo.OSR.SpatialReference(dataset.GetProjectionRef()); var dst = new OSGeo.OSR.SpatialReference(targetProjection); pixelToLatLon = new OSGeo.OSR.CoordinateTransformation(src, dst); latLonToPixel = new OSGeo.OSR.CoordinateTransformation(dst, src); } }
private IEnvelope GetExtent() { if (_GdalDataset != null) { double[] geoTrans = new double[6]; _GdalDataset.GetGeoTransform(geoTrans); GeoTransform GT = new GeoTransform(geoTrans); return(SharpMap.Converters.Geometries.GeometryFactory.CreateEnvelope(GT.Left, GT.Top + (GT.VerticalPixelResolution * _GdalDataset.RasterYSize), GT.Left + (GT.HorizontalPixelResolution * _GdalDataset.RasterXSize), GT.Top)); } return(null); }
public MemoryMappedInt16Terrain(string referenceImage) { Open(TerrainImageFile); using (OSGeo.GDAL.Dataset dataset = OSGeo.GDAL.Gdal.Open(referenceImage, OSGeo.GDAL.Access.GA_ReadOnly)) { _affineTransform = new double[6]; dataset.GetGeoTransform(_affineTransform); string projection = dataset.GetProjectionRef(); var src = new OSGeo.OSR.SpatialReference(projection); var dst = new OSGeo.OSR.SpatialReference(PolarStereographic); _pixelToLineSample = new OSGeo.OSR.CoordinateTransformation(src, dst); } }
private void openFileDSM_FileOk(object sender, CancelEventArgs e) { labDSMin.Text = openFileDSM.FileName; OSGeo.GDAL.Gdal.AllRegister(); OSGeo.GDAL.Dataset ds = OSGeo.GDAL.Gdal.Open(openFileDSM.FileName, OSGeo.GDAL.Access.GA_ReadOnly); double[] a = new double[6]; ds.GetGeoTransform(a); double xx = a[0]; double yy = a[3]; double size = a[1]; double xSixe = ds.RasterXSize; double ySixe = ds.RasterYSize; labInFileInfo.Text += openFileDSM.SafeFileName + ":\r" + "\r\n" + "左上角X坐标:" + xx.ToString() + "\r" + "左上角Y坐标:" + yy.ToString() + "\r" + "像元尺寸:" + size.ToString() + "\r" + "图像大小:" + xSixe.ToString() + "*" + ySixe.ToString(); ds.Dispose(); }
private List <double[]> readImageCoordinatesBoundsInLonLat(OSGeo.GDAL.Dataset imageDataset) { var band = imageDataset.GetRasterBand(1); if (band == null) { return(null); } var width = band.XSize; var height = band.YSize; double[] geoTransformerData = new double[6]; imageDataset.GetGeoTransform(geoTransformerData); SpatialReference currentReference = new SpatialReference(imageDataset.GetProjectionRef()); SpatialReference newReference = GdalUtilities.getWgs84Reference(); CoordinateTransformation ct = new CoordinateTransformation(currentReference, newReference); double[] northWestPoint = new double[2] { geoTransformerData[0], geoTransformerData[3] }; ct.TransformPoint(northWestPoint); double[] southEastPoint = new double[2] { geoTransformerData[0] + geoTransformerData[1] * width, geoTransformerData[3] + geoTransformerData[5] * height }; ct.TransformPoint(southEastPoint); return(new List <double[]> { northWestPoint, southEastPoint }); }
public RasterClass(IRasterDataset dataset, string filename, IPolygon polygon) { try { FileInfo fi = new FileInfo(filename); _title = fi.Name; _filename = filename; _dataset = dataset; OSGeo.GDAL.Gdal.AllRegister(); _gDS = OSGeo.GDAL.Gdal.Open(fi.FullName, 0); if (_gDS == null && _gDS.RasterCount == 0) { _valid = false; return; } _iWidth = _gDS.RasterXSize; _iHeight = _gDS.RasterYSize; switch (fi.Extension.ToLower()) { case ".adf": case ".gsd": _type = RasterType.grid; break; //case ".jp2": // _type = RasterType.wavelet; // break; } using (OSGeo.GDAL.Band band = _gDS.GetRasterBand(1)) { if (_gDS.RasterCount == 1) { if (band.DataType != OSGeo.GDAL.DataType.GDT_Byte) { _type = RasterType.grid; } } band.GetMinimum(out _min, out _hasNoDataVal); band.GetMaximum(out _max, out _hasNoDataVal); band.GetNoDataValue(out _nodata, out _hasNoDataVal); } OSGeo.GDAL.Driver driver = _gDS.GetDriver(); double[] tfw = new double[6]; _gDS.GetGeoTransform(tfw); string tfwFilename = fi.FullName.Substring(0, fi.FullName.Length - fi.Extension.Length); switch (fi.Extension.ToLower()) { case ".jpg": case ".jpeg": tfwFilename += ".jgw"; break; case ".jp2": tfwFilename += ".j2w"; break; case ".tif": case ".tiff": tfwFilename += ".tfw"; break; case ".ecw": tfwFilename += ".eww"; break; default: break; } FileInfo tfwInfo = new FileInfo(tfwFilename); _tfw = new TFWFile(tfw[0], tfw[3], tfw[1], tfw[2], tfw[4], tfw[5]); if (tfwInfo.Exists) { _tfw.Filename = tfwFilename; } if (_tfw.X == 0.0 && _tfw.Y == 0.0 && Math.Abs(_tfw.dx_X) == 1.0 && _tfw.dx_Y == 0.0 && Math.Abs(_tfw.dy_Y) == 1.0 && _tfw.dy_X == 0.0 && driver != null) { if (tfwInfo.Exists) { _tfw = new TFWFile(tfwFilename); } else { _tfw.isValid = false; } } else { // Bei dem Driver schein es nicht Pixelmitte sein, oder ist das bei GDAL generell //if (driver.ShortName.ToLower() == "jp2openjpeg") { _tfw.X += (_tfw.dx_X / 2.0D + _tfw.dx_Y / 2.0D); _tfw.Y += (_tfw.dy_X / 2.0D + _tfw.dy_Y / 2.0D); } } FileInfo fiPrj = new FileInfo(fi.FullName.Substring(0, fi.FullName.Length - fi.Extension.Length) + ".prj"); if (fiPrj.Exists) { StreamReader sr = new StreamReader(fiPrj.FullName); string wkt = sr.ReadToEnd(); sr.Close(); _sRef = gView.Framework.Geometry.SpatialReference.FromWKT(wkt); } else { fiPrj = new FileInfo(fi.FullName.Substring(0, fi.FullName.Length - fi.Extension.Length) + ".wkt"); if (fiPrj.Exists) { StreamReader sr = new StreamReader(fiPrj.FullName); string wkt = sr.ReadToEnd(); sr.Close(); _sRef = gView.Framework.Geometry.SpatialReference.FromWKT(wkt); } } if (polygon != null) { _polygon = polygon; } else { calcPolygon(); } } catch (Exception ex) { string errMsg = ex.Message; _valid = false; } }
private void GetPreview(OSGeo.GDAL.Dataset dataset, System.Drawing.Size size, Graphics g, SharpMap.Geometries.BoundingBox bbox) { double[] geoTrans = new double[6]; dataset.GetGeoTransform(geoTrans); GeoTransform GT = new GeoTransform(geoTrans); int DsWidth = dataset.RasterXSize; int DsHeight = dataset.RasterYSize; Bitmap bitmap = new Bitmap(size.Width, size.Height, PixelFormat.Format24bppRgb); int iPixelSize = 3; //Format24bppRgb = byte[b,g,r] if (dataset != null) { /* * if ((float)size.Width / (float)size.Height > (float)DsWidth / (float)DsHeight) * size.Width = size.Height * DsWidth / DsHeight; * else * size.Height = size.Width * DsHeight / DsWidth; */ double left = Math.Max(bbox.Left, _Envelope.Left); double top = Math.Min(bbox.Top, _Envelope.Top); double right = Math.Min(bbox.Right, _Envelope.Right); double bottom = Math.Max(bbox.Bottom, _Envelope.Bottom); int x1 = (int)GT.PixelX(left); int y1 = (int)GT.PixelY(top); int x1width = (int)GT.PixelXwidth(right - left); int y1height = (int)GT.PixelYwidth(bottom - top); bitmap = new Bitmap(size.Width, size.Height, PixelFormat.Format24bppRgb); BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, size.Width, size.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); try { unsafe { for (int i = 1; i <= (dataset.RasterCount > 3 ? 3 : dataset.RasterCount); ++i) { byte[] buffer = new byte[size.Width * size.Height]; OSGeo.GDAL.Band band = dataset.GetRasterBand(i); //band.ReadRaster(x1, y1, x1width, y1height, buffer, size.Width, size.Height, (int)GT.HorizontalPixelResolution, (int)GT.VerticalPixelResolution); band.ReadRaster(x1, y1, x1width, y1height, buffer, size.Width, size.Height, 0, 0); int p_indx = 0; int ch = 0; //#warning Check correspondance between enum and integer values if (band.GetRasterColorInterpretation() == OSGeo.GDAL.ColorInterp.GCI_BlueBand) { ch = 0; } if (band.GetRasterColorInterpretation() == OSGeo.GDAL.ColorInterp.GCI_GreenBand) { ch = 1; } if (band.GetRasterColorInterpretation() == OSGeo.GDAL.ColorInterp.GCI_RedBand) { ch = 2; } if (band.GetRasterColorInterpretation() != OSGeo.GDAL.ColorInterp.GCI_PaletteIndex) { for (int y = 0; y < size.Height; y++) { byte *row = (byte *)bitmapData.Scan0 + (y * bitmapData.Stride); for (int x = 0; x < size.Width; x++, p_indx++) { row[x * iPixelSize + ch] = buffer[p_indx]; } } } else //8bit Grayscale { for (int y = 0; y < size.Height; y++) { byte *row = (byte *)bitmapData.Scan0 + (y * bitmapData.Stride); for (int x = 0; x < size.Width; x++, p_indx++) { row[x * iPixelSize] = buffer[p_indx]; row[x * iPixelSize + 1] = buffer[p_indx]; row[x * iPixelSize + 2] = buffer[p_indx]; } } } } } } finally { bitmap.UnlockBits(bitmapData); } } g.DrawImage(bitmap, new System.Drawing.Point(0, 0)); }
protected override void SolveInstance(IGH_DataAccess DA) { string output = ""; try { GdalConfiguration.ConfigureOgr(); GdalConfiguration.ConfigureGdal(); output = "It works!"; } catch (Exception e) { output = "{0} Exception caught. " + e; } string input = ""; DA.GetData(0, ref input); string file = input; bool flag = false; DA.GetData(1, ref flag); double minLat = 0.0; DA.GetData(2, ref minLat); double maxLat = 0.0; DA.GetData(3, ref maxLat); double minLon = 0.0; DA.GetData(4, ref minLon); double maxLon = 0.0; DA.GetData(5, ref maxLon); var boolListX = new List <bool>(); var boolListY = new List <bool>(); var boolOut = new List <bool>(); OSGeo.GDAL.Dataset ds = OSGeo.GDAL.Gdal.Open(file, OSGeo.GDAL.Access.GA_ReadOnly); double[] gt = new double[6]; ds.GetGeoTransform(gt); var xres = gt[1]; var yres = gt[5]; var xsize = ds.RasterXSize; var ysize = ds.RasterYSize; var xmin = gt[0] + xres * 0.5; var xmax = gt[0] + (xres * xsize) - xres * 0.5; var ymin = gt[3] + (yres * ysize) + yres * 0.5; var ymax = gt[3] - yres * 0.5; var xx = EnumerableUtilities.RangePython(xmin, xmax + xres, xres).ToArray(); var yy = EnumerableUtilities.RangePython(ymax + yres, ymin, yres).ToArray(); var inMX = new List <double>().ToArray(); var inMY = new List <double>().ToArray(); var xNew = new List <double>(); var yNew = new List <double>(); var M = Acc.Matrix.MeshGrid(inMX, inMY); bool xFirst = false; if (flag == false) { M = Acc.Matrix.MeshGrid(yy, xx); xFirst = false; } else if (flag == true) { for (int i = 0; i < xx.Length; ++i) { if (xx[i] > minLat && xx[i] < maxLat) { xNew.Add(xx[i]); } } for (int i = 0; i < yy.Length; ++i) { if (yy[i] > minLon && yy[i] < maxLon) { yNew.Add(yy[i]); } } if (yNew.Count() < xNew.Count()) { M = Acc.Matrix.MeshGrid(yNew.ToArray(), xNew.ToArray()); xFirst = false; } else if (yNew.Count() > xNew.Count() || yNew.Count() == xNew.Count()) { M = Acc.Matrix.MeshGrid(xNew.ToArray(), yNew.ToArray()); xFirst = true; } } int xSize = 0, ySize = 0; if (xFirst == true) { xSize = M.Item1.GetLength(0); ySize = M.Item2.GetLength(0); } else { xSize = M.Item2.GetLength(0); ySize = M.Item1.GetLength(0); } var x = new double[xSize, ySize]; var y = new double[ySize, xSize]; if (xFirst == true) { x = M.Item1; y = M.Item2; } else { x = M.Item2; y = M.Item1; } x = M.Item2; y = M.Item1; ds = null; DA.SetData(0, output); DA.SetDataList(1, x); DA.SetDataList(2, y); }
static void Main(string[] args) { OSGeo.GDAL.Gdal.AllRegister(); OSGeo.OGR.Ogr.RegisterAll(); //shp驱动 OSGeo.OGR.Driver shpDataDriver = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); //shp数据源 shpDataSet = shpDataDriver.CreateDataSource(shpSavePath, null); //img驱动 gdalDriver = OSGeo.GDAL.Gdal.GetDriverByName("HFA"); //dsm数据源 dsmDataset = OSGeo.GDAL.Gdal.Open(dsmPath, OSGeo.GDAL.Access.GA_Update); //dsm数据信息 dsmDataset.GetGeoTransform(dsm_Transform); dsm_Xsize = dsmDataset.RasterXSize; dsm_Ysize = dsmDataset.RasterYSize; //投影信息 srs = dsmDataset.GetProjectionRef() == "" ? null : new OSGeo.OSR.SpatialReference(dsmDataset.GetProjectionRef()); Stopwatch aTime = new Stopwatch(); aTime.Start(); //1 坡度图 buildSlope(); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); //2 坡度线 OSGeo.OGR.Layer pdx = getPDX(1); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); OSGeo.OGR.Layer slopeCleanLayer = cleanLayer(pdx, 200, 5000); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); //3 等高线 OSGeo.OGR.Layer dzx = getDZX_(); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); OSGeo.OGR.Layer dzxPolyLayer = cleanDZX(dzx); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); //4 筛选 OSGeo.OGR.Layer selectLayer = selectionFeatuers(slopeCleanLayer, dzxPolyLayer); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); OSGeo.OGR.Layer resLayer = cleanLayer_FF(selectLayer); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); // 最小外接矩形 getMinOutLineFromLayerToLayer(resLayer); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); //5 简化 jianhua(resLayer, 175, 5); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); //6 高度值 未完成 //getH(resLayer); //StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); shpDataSet.Dispose(); shpDataDriver.Dispose(); dsmDataset.Dispose(); gdalDriver.Dispose(); // aTime.Stop(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); }
/// <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); }