コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: batuZ/outlines
        /// <summary>
        /// 获取等高线
        /// </summary>
        /// <returns></returns>
        static OSGeo.OGR.Layer getDZX_()
        {
            StaticTools.msgLine("createDZX...");
            //分析数据源
            double noDataValue;                 //无效值
            int    hasDataValue;                //0不使用无效值,1使用无效值

            dsmDataset.GetRasterBand(1).GetNoDataValue(out noDataValue, out hasDataValue);
            //WKT
            string wkt = dsmDataset.GetProjectionRef();

            OSGeo.OSR.SpatialReference srs = wkt == "" ? null : new OSGeo.OSR.SpatialReference(wkt);
            //图像值属性,最大值、最小值、平均值
            double min, max, mean, std;

            dsmDataset.GetRasterBand(1).GetStatistics(0, 1, out min, out max, out mean, out std);
            //计算每级线的值,加0.5是确保取到最接近的整数,不被四舍五入
            int count = Convert.ToInt32((max - min) / jianG + 0.5);

            double[] shu = new double[count];
            for (int i = 0; i < count; i++)
            {
                shu[i] = min + jianG * i;
            }

            //创建空的SHP,准备塞入数据
            shpDataSet.deleteLayerByName("dzx");
            OSGeo.OGR.Layer dzxLayer = shpDataSet.CreateLayer("dzx", srs, OSGeo.OGR.wkbGeometryType.wkbMultiLineString, null);
            //必须有这两个字段,函数要往里塞值,其实没毛用
            OSGeo.OGR.FieldDefn fieldDf0 = new OSGeo.OGR.FieldDefn("LID", OSGeo.OGR.FieldType.OFTInteger);
            OSGeo.OGR.FieldDefn fieldDf1 = new OSGeo.OGR.FieldDefn("EVE", OSGeo.OGR.FieldType.OFTReal);
            dzxLayer.CreateField(fieldDf0, 1); //ID
            dzxLayer.CreateField(fieldDf1, 1); //Value

            //Band(1), 间隔, 起始高度, 分段数量, 分段值数组, 是否有无效值, 无效值, 预置图层. ID字段, 高度值字段, null , null
            OSGeo.GDAL.Gdal.ContourGenerate(dsmDataset.GetRasterBand(1), jianG, min, count, shu, hasDataValue, noDataValue, dzxLayer, 0, 1, null, null);

            if (dzxLayer.GetFeatureCount(0) > 0)
            {
                return(dzxLayer);
            }
            else
            {
                return(null);
            }
        }
コード例 #4
0
        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
            });
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: batuZ/outlines
        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);
        }