Пример #1
0
        private static SqlGeometry CreateDefault(EsriShapeType esriType, int srid)
        {
            switch (esriType)
            {
            case EsriShapeType.EsriPoint:
            case EsriShapeType.EsriPointM:
            case EsriShapeType.EsriPointZ:
                return(SqlSpatialHelper.CreateEmptyPoint(srid));

            case EsriShapeType.EsriMultiPoint:
            case EsriShapeType.EsriMultiPointM:
            case EsriShapeType.EsriMultiPointZ:
                return(SqlSpatialHelper.CreateEmptyMultipoint(srid));

            case EsriShapeType.EsriPolyLine:
            case EsriShapeType.EsriPolyLineM:
            case EsriShapeType.EsriPolyLineZ:
                return(SqlSpatialHelper.CreateEmptyLineString(srid));

            case EsriShapeType.EsriPolygon:
            case EsriShapeType.EsriPolygonM:
            case EsriShapeType.EsriPolygonZ:
                return(SqlSpatialHelper.CreateEmptyPolygon(srid));

            case EsriShapeType.NullShape:
            case EsriShapeType.EsriMultiPatch:
            default:
                return(SqlGeometry.Null);
            }
        }
Пример #2
0
        private static bool AreConsistent(EsriShapeType esriType, OpenGisGeometryType ogcType)
        {
            switch (ogcType)
            {
            case OpenGisGeometryType.Point:
                return(esriType == EsriShapeType.EsriPoint || esriType == EsriShapeType.EsriPointM || esriType == EsriShapeType.EsriPointZ);

            case OpenGisGeometryType.MultiLineString:
            case OpenGisGeometryType.LineString:
                return(esriType == EsriShapeType.EsriPolyLine || esriType == EsriShapeType.EsriPolyLineM || esriType == EsriShapeType.EsriPolyLineZ);

            case OpenGisGeometryType.Polygon:
            case OpenGisGeometryType.MultiPolygon:
                return(esriType == EsriShapeType.EsriPolygon || esriType == EsriShapeType.EsriPolygonM || esriType == EsriShapeType.EsriPolygonZ);

            case OpenGisGeometryType.MultiPoint:
                return(esriType == EsriShapeType.EsriMultiPoint || esriType == EsriShapeType.EsriMultiPointM || esriType == EsriShapeType.EsriMultiPointZ);

            case OpenGisGeometryType.GeometryCollection:
            case OpenGisGeometryType.CircularString:
            case OpenGisGeometryType.CompoundCurve:
            case OpenGisGeometryType.CurvePolygon:
            default:
                return(false);
            }
        }
Пример #3
0
        public static void Write(string fileName, IEsriShapeCollection shapes, EsriShapeType shapeType, bool overwrite = false)
        {
            System.IO.MemoryStream shxWriter = new System.IO.MemoryStream();

            int offset = 50;

            foreach (IEsriShape item in shapes)
            {
                shxWriter.Write(WriteHeaderToByte(offset, item.ContentLength), 0, 2 * ShapeConstants.IntegerSize);

                offset += item.ContentLength + 4;
            }

            System.IO.MemoryStream writer = new System.IO.MemoryStream();

            int fileLength = (int)shxWriter.Length / 2 + 50;

            writer.Write(WriteMainHeader(shapes, fileLength, shapeType), 0, 100);

            writer.Write(shxWriter.ToArray(), 0, (int)shxWriter.Length);

            //var mode = overwrite ? System.IO.FileMode.Create : System.IO.FileMode.CreateNew;
            var mode = Shapefile.GetMode(fileName, overwrite);

            System.IO.FileStream stream = new System.IO.FileStream(fileName, mode);

            writer.WriteTo(stream);

            shxWriter.Close();

            writer.Close();

            stream.Close();
        }
Пример #4
0
        /// <summary>
        /// Translates the geometry type from the Esri Shape format to the geometry type
        /// used by ArcObjects/ProSuite.
        /// </summary>
        /// <param name="shapeType"></param>
        /// <returns></returns>
        public static ProSuiteGeometryType TranslateEsriShapeType(EsriShapeType shapeType)
        {
            ProSuiteGeometryType geometryType;

            switch (shapeType)
            {
            case EsriShapeType.EsriShapeGeneralPoint:
            case EsriShapeType.EsriShapePoint:
            case EsriShapeType.EsriShapePointZ:
            case EsriShapeType.EsriShapePointM:
            case EsriShapeType.EsriShapePointZM:
                geometryType = ProSuiteGeometryType.Point;
                break;

            case EsriShapeType.EsriShapeGeneralMultipoint:
            case EsriShapeType.EsriShapeMultipoint:
            case EsriShapeType.EsriShapeMultipointZ:
            case EsriShapeType.EsriShapeMultipointM:
            case EsriShapeType.EsriShapeMultipointZM:
                geometryType = ProSuiteGeometryType.Multipoint;
                break;

            case EsriShapeType.EsriShapeGeneralPolyline:
            case EsriShapeType.EsriShapePolyline:
            case EsriShapeType.EsriShapePolylineZ:
            case EsriShapeType.EsriShapePolylineM:
            case EsriShapeType.EsriShapePolylineZM:
                geometryType = ProSuiteGeometryType.Polyline;
                break;

            case EsriShapeType.EsriShapeGeneralPolygon:
            case EsriShapeType.EsriShapePolygon:
            case EsriShapeType.EsriShapePolygonZ:
            case EsriShapeType.EsriShapePolygonM:
            case EsriShapeType.EsriShapePolygonZM:
                geometryType = ProSuiteGeometryType.Polygon;
                break;

            case EsriShapeType.EsriShapeGeneralMultiPatch:
            case EsriShapeType.EsriShapeMultiPatch:
            case EsriShapeType.EsriShapeMultiPatchM:
                geometryType = ProSuiteGeometryType.MultiPatch;
                break;

            case EsriShapeType.EsriShapeNull:
                geometryType = ProSuiteGeometryType.Null;
                break;

            default:
                throw new ArgumentOutOfRangeException(
                          $"Unsupported geometry type: {shapeType}");
            }

            return(geometryType);
        }
Пример #5
0
        internal override void UpdateUI()
        {
            base.UpdateUI();

            if (this.ShapeModels == null)
            {
                return;
            }

            if (this.colorizerCache != null && !this.areModelsProcessed)
            {
                this.colorizerCache.Initialize(this.ShapeModels);
            }

            EsriShapeType shapeType = this.ShapeModels.Type;

            switch (shapeType)
            {
            case EsriShapeType.NullShape:
                break;

            case EsriShapeType.Point:
            case EsriShapeType.PointM:
            case EsriShapeType.PointZ:
            case EsriShapeType.Multipoint:
            case EsriShapeType.MultipointM:
            case EsriShapeType.MultipointZ:
                this.RenderFilledShape();
                break;

            case EsriShapeType.Polyline:
            case EsriShapeType.PolylineM:
            case EsriShapeType.PolylineZ:
                this.RenderPolylines(false);
                break;

            case EsriShapeType.Polygon:
            case EsriShapeType.PolygonM:
            case EsriShapeType.PolygonZ:
                this.RenderPolylines(true);
                break;

            default:
                throw new NotSupportedException();
            }

            this.areModelsProcessed = true;
        }
Пример #6
0
        /// <summary>
        /// Removes Extera Geometries with inconsistent types (based on esriType argument)
        /// </summary>
        /// <param name="esriType"></param>
        /// <param name="geometry"></param>
        /// <returns></returns>
        private static SqlGeometry ClearGeometry(EsriShapeType esriType, SqlGeometry geometry, int srid)
        {
            var collection = new List <SqlGeometry>();

            for (int i = 0; i < geometry.STNumGeometries(); i++)
            {
                var temp = geometry.STGeometryN(i + 1);

                if (!temp.IsNotValidOrEmpty() && AreConsistent(esriType, temp.GetOpenGisType()))
                {
                    collection.Add(temp);
                }
            }

            var result = CreateDefault(esriType, srid);

            for (int i = 0; i < collection.Count; i++)
            {
                result = result.STUnion(collection[i]);
            }

            return(result);
        }
        internal MainFileHeader(int fileLength, EsriShapeType type, IRI.Msh.Common.Primitives.BoundingBox minimumnBoundingBox)
        {
            this.m_Version = 9994;

            this.m_FileLength = fileLength;

            this.m_ShapeType = (int)type;

            this.m_XMin = minimumnBoundingBox.XMin;

            this.m_YMin = minimumnBoundingBox.YMin;

            this.m_XMax = minimumnBoundingBox.XMax;

            this.m_YMax = minimumnBoundingBox.YMax;

            this.m_ZMax = 0;

            this.m_ZMin = 0;

            this.m_MMax = 0;

            this.m_MMin = 0;
        }
Пример #8
0
 public zReader(string fileName, EsriShapeType type, int srid)
     : base(fileName, type, srid)
 {
 }
Пример #9
0
        private static Task <MapShapeModelCollection> ParseShapes(object state)
        {
            ParseShapeTaskState taskState = (ParseShapeTaskState)state;
            var cancellationTokenSource   = taskState.CancellationTokenSource;
            var token = cancellationTokenSource.Token;

            var task = Task.Factory.StartNew(async() =>
            {
                using (var shapeStream = taskState.Stream.CloneStream())
                {
                    int start = taskState.Start;
                    int end   = taskState.End;
                    var coordinateConverter = taskState.CoordinateConverter;
                    var records             = taskState.Records;

                    MapShapeModelCollection shapeModels = new MapShapeModelCollection();

                    for (int i = start; i < end; i++)
                    {
                        if (cancellationTokenSource.IsCancellationRequested)
                        {
                            return(null);
                        }

                        int contentOffset = records[i].ContentOffset;
                        shapeStream.Seek((ulong)contentOffset);

                        int contentLength = records[i].ContentLength;
                        byte[] content    = new byte[contentLength];

                        await shapeStream.ReadAsync(content.AsBuffer(), (uint)contentLength, InputStreamOptions.Partial);

                        EsriShapeType shapeType = (EsriShapeType)BitConverter.ToInt32(content, 0);
                        if (shapeModels.Type == EsriShapeType.NullShape)
                        {
                            shapeModels.Type = shapeType;
                        }

                        // TODO: Consider specific support for "M" types (PointM, MultipointM, PolygonM) that support measure coordinate -- is this the Bubble visualization?.
                        switch (shapeType)
                        {
                        case EsriShapeType.NullShape:
                            shapeModels.Add(new NullShapeModel());
                            break;

                        case EsriShapeType.Point:
                        case EsriShapeType.PointM:
                        case EsriShapeType.PointZ:
                            CreatePoint(content, shapeModels, 4, coordinateConverter);
                            break;

                        case EsriShapeType.Polyline:
                        case EsriShapeType.PolylineM:
                        case EsriShapeType.PolylineZ:
                            CreatePolyline(content, shapeModels, coordinateConverter);
                            break;

                        case EsriShapeType.Polygon:
                        case EsriShapeType.PolygonM:
                        case EsriShapeType.PolygonZ:
                            CreatePolygon(content, shapeModels, coordinateConverter);
                            break;

                        default:
                            throw new NotSupportedException("The supported ESRI shape types are Point(MZ), Polyline(MZ), and Polygon(MZ).");
                        }
                    }

                    return(shapeModels);
                }
            },
                                             token).Unwrap();

            return(task);
        }
Пример #10
0
        internal static byte[] WriteMainHeader(IEsriShapeCollection shapes, int fileLength, EsriShapeType shapeType)
        {
            System.IO.MemoryStream result = new System.IO.MemoryStream();

            result.Write(IRI.Msh.Common.Helpers.StreamHelper.Int32ToBigEndianOrderedBytes(ShapeConstants.FileCode), 0, ShapeConstants.IntegerSize);

            result.Write(System.BitConverter.GetBytes(0), 0, ShapeConstants.IntegerSize);

            result.Write(System.BitConverter.GetBytes(0), 0, ShapeConstants.IntegerSize);

            result.Write(System.BitConverter.GetBytes(0), 0, ShapeConstants.IntegerSize);

            result.Write(System.BitConverter.GetBytes(0), 0, ShapeConstants.IntegerSize);

            result.Write(System.BitConverter.GetBytes(0), 0, ShapeConstants.IntegerSize);

            result.Write(IRI.Msh.Common.Helpers.StreamHelper.Int32ToBigEndianOrderedBytes(fileLength), 0, ShapeConstants.IntegerSize);

            result.Write(System.BitConverter.GetBytes(ShapeConstants.Version), 0, ShapeConstants.IntegerSize);

            result.Write(System.BitConverter.GetBytes((int)shapeType), 0, ShapeConstants.IntegerSize);

            result.Write(System.BitConverter.GetBytes(shapes.MainHeader.XMin), 0, ShapeConstants.DoubleSize);

            result.Write(System.BitConverter.GetBytes(shapes.MainHeader.YMin), 0, ShapeConstants.DoubleSize);

            result.Write(System.BitConverter.GetBytes(shapes.MainHeader.XMax), 0, ShapeConstants.DoubleSize);

            result.Write(System.BitConverter.GetBytes(shapes.MainHeader.YMax), 0, ShapeConstants.DoubleSize);


            double tempValue = shapes.MainHeader.ZMin;

            if (double.IsNaN(tempValue))
            {
                tempValue = 0;
            }

            result.Write(System.BitConverter.GetBytes(tempValue), 0, ShapeConstants.DoubleSize);


            tempValue = shapes.MainHeader.ZMax;

            if (double.IsNaN(tempValue))
            {
                tempValue = 0;
            }

            result.Write(System.BitConverter.GetBytes(tempValue), 0, ShapeConstants.DoubleSize);


            tempValue = shapes.MainHeader.MMin;

            if (double.IsNaN(tempValue))
            {
                tempValue = 0;
            }

            result.Write(System.BitConverter.GetBytes(tempValue), 0, ShapeConstants.DoubleSize);


            tempValue = shapes.MainHeader.MMax;

            if (double.IsNaN(tempValue))
            {
                tempValue = 0;
            }

            result.Write(System.BitConverter.GetBytes(tempValue), 0, ShapeConstants.DoubleSize);

            return(result.ToArray());
        }
Пример #11
0
        public static void Save(string shpFileName, IEnumerable <IEsriShape> shapes, bool createDbf = false, bool overwrite = false, SrsBase srs = null)
        {
            if (shapes.IsNullOrEmpty())
            {
                return;
            }

            var directory = System.IO.Path.GetDirectoryName(shpFileName);

            if (!System.IO.Directory.Exists(directory) && !string.IsNullOrEmpty(directory))
            {
                System.IO.Directory.CreateDirectory(directory);
            }

            IEsriShapeCollection collection = new EsriShapeCollection <IEsriShape>(shapes);

            EsriShapeType shapeType = shapes.First().Type;

            using (System.IO.MemoryStream featureWriter = new System.IO.MemoryStream())
            {
                int recordNumber = 0;

                foreach (IEsriShape item in shapes)
                {
                    featureWriter.Write(ShpWriter.WriteHeaderToByte(++recordNumber, item), 0, 2 * ShapeConstants.IntegerSize);

                    featureWriter.Write(item.WriteContentsToByte(), 0, 2 * item.ContentLength);
                }

                using (System.IO.MemoryStream shpWriter = new System.IO.MemoryStream())
                {
                    int fileLength = (int)featureWriter.Length / 2 + 50;

                    shpWriter.Write(ShpWriter.WriteMainHeader(collection, fileLength, shapeType), 0, 100);

                    shpWriter.Write(featureWriter.ToArray(), 0, (int)featureWriter.Length);

                    //var mode = overwrite ? System.IO.FileMode.Create : System.IO.FileMode.CreateNew;
                    var mode = Shapefile.GetMode(shpFileName, overwrite);

                    System.IO.FileStream stream = new System.IO.FileStream(shpFileName, mode);

                    shpWriter.WriteTo(stream);

                    stream.Close();

                    shpWriter.Close();

                    featureWriter.Close();
                }
            }

            ShxWriter.Write(Shapefile.GetShxFileName(shpFileName), collection, shapeType, overwrite);

            if (createDbf)
            {
                Dbf.DbfFile.WriteDefault(Shapefile.GetDbfFileName(shpFileName), collection.Count, overwrite);
            }

            //try to automatically find srs
            if (srs == null)
            {
                var srid = shapes.First()?.Srid ?? 0;

                srs = SridHelper.AsSrsBase(srid);
            }

            if (srs != null)
            {
                SaveAsPrj(shpFileName, srs, overwrite);
            }
        }
Пример #12
0
        public static ProSuiteGeometryType GetGeometryType([NotNull] byte[] esriShapeBuffer)
        {
            EsriShapeType shapeType = GetShapeType(esriShapeBuffer);

            return(TranslateEsriShapeType(shapeType));
        }
Пример #13
0
        internal static byte[] WriteMainHeader(IEsriShapeCollection shapes, int fileLength, EsriShapeType shapeType)
        {
            return(ShpWriter.WriteMainHeader(shapes, fileLength, shapeType));
            //System.IO.MemoryStream result = new System.IO.MemoryStream();

            //result.Write(IRI.Ket.IO.Binary.Int32ToBigEndianOrderedBytes(ShapeConstants.FileCode), 0, ShapeConstants.IntegerSize);

            //result.Write(System.BitConverter.GetBytes(0), 0, ShapeConstants.IntegerSize);

            //result.Write(System.BitConverter.GetBytes(0), 0, ShapeConstants.IntegerSize);

            //result.Write(System.BitConverter.GetBytes(0), 0, ShapeConstants.IntegerSize);

            //result.Write(System.BitConverter.GetBytes(0), 0, ShapeConstants.IntegerSize);

            //result.Write(System.BitConverter.GetBytes(0), 0, ShapeConstants.IntegerSize);

            //result.Write(IRI.Ket.IO.Binary.Int32ToBigEndianOrderedBytes(fileLength), 0, ShapeConstants.IntegerSize);

            //result.Write(System.BitConverter.GetBytes(ShapeConstants.Version), 0, ShapeConstants.IntegerSize);

            //result.Write(System.BitConverter.GetBytes((int)shapeType), 0, ShapeConstants.IntegerSize);

            //result.Write(System.BitConverter.GetBytes(MapStatistics.GetMinX(shapes)), 0, ShapeConstants.DoubleSize);

            //result.Write(System.BitConverter.GetBytes(MapStatistics.GetMinY(shapes)), 0, ShapeConstants.DoubleSize);

            //result.Write(System.BitConverter.GetBytes(MapStatistics.GetMaxX(shapes)), 0, ShapeConstants.DoubleSize);

            //result.Write(System.BitConverter.GetBytes(MapStatistics.GetMaxY(shapes)), 0, ShapeConstants.DoubleSize);


            //double tempValue = MapStatistics.GetMinZ(shapes);

            //if (double.IsNaN(tempValue)) { tempValue = 0; }

            //result.Write(System.BitConverter.GetBytes(tempValue), 0, ShapeConstants.DoubleSize);


            //tempValue = MapStatistics.GetMaxZ(shapes);

            //if (double.IsNaN(tempValue)) { tempValue = 0; }

            //result.Write(System.BitConverter.GetBytes(tempValue), 0, ShapeConstants.DoubleSize);


            //tempValue = MapStatistics.GetMinM(shapes);

            //if (double.IsNaN(tempValue)) { tempValue = 0; }

            //result.Write(System.BitConverter.GetBytes(tempValue), 0, ShapeConstants.DoubleSize);


            //tempValue = MapStatistics.GetMaxM(shapes);

            //if (double.IsNaN(tempValue)) { tempValue = 0; }

            //result.Write(System.BitConverter.GetBytes(tempValue), 0, ShapeConstants.DoubleSize);

            //return result.ToArray();
        }
Пример #14
0
        protected ShpReader(string fileName, EsriShapeType type, int srid)
        {
            this._srid = srid;
            //this.directoryName = System.IO.Path.GetDirectoryName(fileName);

            //this.fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(fileName);

            if (!Shapefile.CheckAllNeededFilesExists(fileName))
            {
                throw new NotImplementedException();
            }

            ShxReader shxFile = new ShxReader(Shapefile.GetShxFileName(fileName));

            using (System.IO.FileStream shpStream = new System.IO.FileStream(fileName, System.IO.FileMode.Open))
            {
                using (this.shpReader = new System.IO.BinaryReader(shpStream))
                {
                    this.MainHeader = new MainFileHeader(this.shpReader.ReadBytes(ShapeConstants.MainHeaderLengthInBytes));

                    if ((EsriShapeType)this.MainHeader.ShapeType != type)
                    {
                        throw new NotImplementedException();
                    }

                    if (!MainFileHeader.CanBeForTheSameShapefile(this.MainHeader, shxFile.MainHeader))
                    {
                        throw new NotImplementedException();
                    }

                    this.elements = new EsriShapeCollection <T>(this.MainHeader);

                    int numberOfRecords = shxFile.NumberOfRecords;

                    for (int i = 0; i < numberOfRecords; i++)
                    {
                        int offset, contentLength02;

                        shxFile.GetRecord(i, out offset, out contentLength02);

                        shpReader.BaseStream.Position = offset * 2;

                        int recordNumber, contentLength;

                        ReadRecordHeader(out recordNumber, out contentLength);

                        if (contentLength != contentLength02)
                        {
                            System.Diagnostics.Trace.WriteLine("ERROR at contentLength != contentLength02: i=" + i.ToString());
                            //throw new NotImplementedException();
                        }

                        if (contentLength == 2)
                        {
                            continue;
                        }

                        elements.Add(ReadElement());

                        //4:                length of the record header in words
                        //contentLength:    length of the contents in words
                        //this.tempPosition = this.tempPosition - (ShapeConstants.RecordHeaderLengthInWords + contentLength);
                    }
                }
            }
        }