如何在c#

时间:2016-04-19 07:39:30

标签: c# gis nettopologysuite

我正在寻找一种“干净”的方式来将栅格加载到我的c#代码中。通过栅格我的意思是QGis或ArcGis能够加载的任何(或至少一些)XYZ文件:.tif,.rrd ......

我正在使用NetTopologySuite。这个库适用于shapefile,这让我觉得可能有一个光栅阅读器。我一直在努力将我的研究重点放在NetTopologySuite.IO命名空间下,该命名空间包含了不少读者。

我已经用NetTopologySuite标记了这篇文章,希望有些c#-savvy比我对这个特定的库知之甚少。

1 个答案:

答案 0 :(得分:2)

我使用LibTiff.Net作为.tif,但我没有要求任何其他格式。 UpperLeft和BottomRight属性用于将图像定位在世界地图上。我没有处理模型转换案例,因为它非常复杂 - 再次 - 目前没有要求这样做。

        var imageStreamSource = new FileStream(Filename, FileMode.Open, FileAccess.Read, FileShare.Read);
        var decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        var bitmapSource = decoder.Frames[0];

        // Draw the Image
        Image = bitmapSource.ToBitmap();

        using (var tiff = Tiff.Open(Filename, "r"))
        {
            Height = tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
            Width = tiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt();

            // see http://www.remotesensing.org/geotiff/spec/geotiff2.6.html#2.6.1

            var modelPixelScaleTag = tiff.GetField(TiffTag.GEOTIFF_MODELPIXELSCALETAG);
            var modelTiepointTag = tiff.GetField(TiffTag.GEOTIFF_MODELTIEPOINTTAG);
            //var modelTransformTag = tiff.GetField(TiffTag.GEOTIFF_MODELTRANSFORMATIONTAG);

            var modelPixelScale = modelPixelScaleTag[1].GetBytes();
            var ScaleX = BitConverter.ToDouble(modelPixelScale, 0);
            var ScaleY = BitConverter.ToDouble(modelPixelScale, 8) * -1;

            if (modelTiepointTag != null)
            {
                var modelTransformation = modelTiepointTag[1].GetBytes();
                var originLon = BitConverter.ToDouble(modelTransformation, 24);
                var originLat = BitConverter.ToDouble(modelTransformation, 32);

                // origin is the center of the pixel, so offset to
                var startLat = originLat + (ScaleY / 2.0);
                var startLon = originLon + (ScaleX / 2.0);

                UpperLeft = new Position(startLat, startLon);
                BottomRight = new Position(startLat + ScaleY * Height, startLon + ScaleX * Width);
            }
            //else if (modelTransformTag != null)
            //{
            // this is very complicated
            //}
            else
            {
                throw new Exception("Couldn't understand the TIFF format");
            }
        }