private static Geometry GetGeometryFromBuffer(byte[] geomBuffer, SpatialReference sr)
        {
            var geomType = GetGeometryType(geomBuffer);

            switch (geomType)
            {
            case GeometryType.Point:
            {
                int    offset = 4;
                double x      = DoubleWithNaN(BitConverter.ToDouble(geomBuffer, offset));
                offset += 8;
                double y = DoubleWithNaN(BitConverter.ToDouble(geomBuffer, offset));

                var mp = MapPointBuilder.FromEsriShape(geomBuffer, sr);
                //System.Diagnostics.Debug.WriteLine($@"x: {x} = {mp.X} y: {y} = {mp.Y}");
                return(mp);
            }

            case GeometryType.Polyline:
            {
                var line = PolylineBuilder.FromEsriShape(geomBuffer, sr);
                return(line);
            }

            case GeometryType.Polygon:
            {
                var poly = PolygonBuilder.FromEsriShape(geomBuffer, sr);
                return(poly);
            }
            }
            return(null);
        }
Пример #2
0
        private static Geometry FromEsriShapeBuffer([NotNull] byte[] byteArray,
                                                    [CanBeNull] SpatialReference spatialReference)
        {
            var shapeType = EsriShapeFormatUtils.GetShapeType(byteArray);

            if (byteArray.Length == 5 && shapeType == EsriShapeType.EsriShapeNull)
            {
                // in case the original geometry was empty, ExportToWkb does not store byte order nor geometry type.
                throw new ArgumentException(
                          "The provided byte array represents an empty geometry with no geometry type information. Unable to create geometry");
            }

            Geometry result;

            var geometryType = EsriShapeFormatUtils.TranslateEsriShapeType(shapeType);

            switch (geometryType)
            {
            case ProSuiteGeometryType.Point:
                result = MapPointBuilder.FromEsriShape(byteArray, spatialReference);
                break;

            case ProSuiteGeometryType.Polyline:
                result = PolylineBuilder.FromEsriShape(byteArray, spatialReference);
                break;

            case ProSuiteGeometryType.Polygon:
                result = PolygonBuilder.FromEsriShape(byteArray, spatialReference);
                break;

            case ProSuiteGeometryType.Multipoint:
                result = MultipointBuilder.FromEsriShape(byteArray, spatialReference);
                break;

            case ProSuiteGeometryType.MultiPatch:
                result = MultipatchBuilder.FromEsriShape(byteArray, spatialReference);
                break;

            case ProSuiteGeometryType.Bag:
                result = GeometryBagBuilder.FromEsriShape(
                    byteArray, spatialReference);                             // experimental
                break;

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

            return(result);
        }
        /// <summary>
        /// Custom interface specific to the way the sample is implemented.
        /// </summary>
        public PluginRow FindRow(int oid, IEnumerable <string> columnFilter, SpatialReference srout)
        {
            Geometry shape = null;

            List <object> values = new List <object>();
            var           row    = _table.Rows.Find(oid);
            //The order of the columns in the returned rows ~must~ match
            //GetFields. If a column is filtered out, an empty placeholder must
            //still be provided even though the actual value is skipped
            var columnNames = this.GetFields().Select(col => col.Name.ToUpper()).ToList();

            foreach (var colName in columnNames)
            {
                if (columnFilter.Contains(colName))
                {
                    //special handling for shape
                    if (colName == "SHAPE")
                    {
                        var buffer = row["SHAPE"] as Byte[];
                        shape = MapPointBuilder.FromEsriShape(buffer, _sr);
                        if (srout != null)
                        {
                            if (!srout.Equals(_sr))
                            {
                                shape = GeometryEngine.Instance.Project(shape, srout);
                            }
                        }
                        values.Add(shape);
                    }
                    else
                    {
                        values.Add(row[colName]);
                    }
                }
                else
                {
                    values.Add(System.DBNull.Value);//place holder
                }
            }
            return(new PluginRow()
            {
                Values = values
            });
        }