Exemple #1
0
        public IGeometry CreateGeometry(ICoordinateSequence coordinates, OgcGeometryType type)
        {
            switch (type)
            {
            case OgcGeometryType.Point:
                return(CreatePoint(coordinates));

            case OgcGeometryType.LineString:
                return(CreateLineString(coordinates));

            case OgcGeometryType.Polygon:
                return(CreatePolygon(coordinates));

            case OgcGeometryType.MultiPoint:
                return(CreateMultiPoint(coordinates));

            case OgcGeometryType.MultiPolygon:
                return(CreateMultiPolygon(coordinates));

            case OgcGeometryType.MultiLineString:
            case OgcGeometryType.GeometryCollection:
            case OgcGeometryType.Geometry:
            case OgcGeometryType.Curve:
            case OgcGeometryType.Surface:
            case OgcGeometryType.MultiSurface:
            case OgcGeometryType.MultiCurve:
            default:
                throw new NotSupportedException("Geometry type not supported: " + type);
            }
        }
Exemple #2
0
        public static PostGis2GeometryType ToPostGis2(this OgcGeometryType self)
        {
            switch (self)
            {
            case OgcGeometryType.Point:
            case OgcGeometryType.LineString:
            case OgcGeometryType.Polygon:
            case OgcGeometryType.MultiPoint:
            case OgcGeometryType.MultiLineString:
            case OgcGeometryType.MultiPolygon:
            case OgcGeometryType.GeometryCollection:
            case OgcGeometryType.CircularString:
            case OgcGeometryType.CompoundCurve:
            case OgcGeometryType.MultiCurve:
            case OgcGeometryType.MultiSurface:
                return((PostGis2GeometryType)self);

            case OgcGeometryType.PolyhedralSurface:
                return(PostGis2GeometryType.PolyhedralSurface);

            case OgcGeometryType.TIN:
                return(PostGis2GeometryType.TIN);

            default:
                throw new InvalidOperationException();
            }
        }
Exemple #3
0
        public void TestSanD(OgcGeometryType type, int num, bool threeD)
        {
            var fc = new FeatureCollection();

            for (int i = 0; i < num; i++)
            {
                fc.Add(FeatureFactory.Create(type, ("id", TypeCode.Int32),
                                             ("label", TypeCode.String), ("number1", TypeCode.Double),
                                             ("number2", TypeCode.Int64)
                                             ));
            }

            var options = DefaultOptions;

            options.IgnoreNullValues = true;
            string json = ToJsonString(fc, options);
            var    d    = Deserialize(json, options);

            Assert.That(d, Is.Not.Null);
            Assert.That(d.Count, Is.EqualTo(fc.Count));
            for (int i = 0; i < fc.Count; i++)
            {
                FeatureConverterTest.CheckEquality(fc[i], d[i]);
            }
        }
        public PostGisProvider(IGeometryFactory geometryFactory, string connectionString,
                               string tableSchema, string tableName, string oidColumn, string geometryColumn,
                               ICoordinateTransformationFactory coordinateTransformationFactory)
            : base(
                new PostGisDbUtility(), geometryFactory, connectionString, tableSchema,
                tableName,
                oidColumn,
                geometryColumn,
                coordinateTransformationFactory)
        {
            using (NpgsqlConnection cn = (NpgsqlConnection)DbUtility.CreateConnection(connectionString))
            {
                try
                {
                    cn.Open();

                    if (!PostGisProviderStatic.Has_X_Privilege(cn, "table", "\"public\".\"geometry_columns\"", "SELECT"))
                    {
                        throw new PostGisException(
                                  "Insufficient rights to access table \"public\".\"geometry_columns\"!");
                    }

                    if (
                        !PostGisProviderStatic.Has_X_Privilege(cn, "table",
                                                               string.Format("\"{0}\".\"{1}\"", tableSchema, tableName),
                                                               "SELECT"))
                    {
                        throw new PostGisException(string.Format(
                                                       "Insufficient rights to access table \"{0}\".\"{1}\"!",
                                                       tableSchema, tableName));
                    }

                    NpgsqlCommand cmd = (NpgsqlCommand)DbUtility.CreateCommand();
                    cmd.Connection  = cn;
                    cmd.CommandText =
                        @"SELECT x.""type""
    FROM ""public"".""geometry_columns"" AS x
    WHERE (x.""f_table_schema""=:p0 AND x.""f_table_name""=:p1 AND x.""f_geometry_column""=:p2);";
                    cmd.Parameters.Add(DbUtility.CreateParameter("p0", tableSchema, ParameterDirection.Input));
                    cmd.Parameters.Add(DbUtility.CreateParameter("p1", tableName, ParameterDirection.Input));
                    cmd.Parameters.Add(DbUtility.CreateParameter("p2", geometryColumn, ParameterDirection.Input));

                    NpgsqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    if (dr.HasRows)
                    {
                        dr.Read();
                        //valid geometry type
                        _validGeometryType = parseGeometryType(dr.GetString(0));
                    }
                    else
                    {
                        _validGeometryType = OgcGeometryType.Geometry;
                    }
                }
                catch (Exception)
                {
                    _validGeometryType = OgcGeometryType.Unknown;
                }
            }
        }
Exemple #5
0
//    [InlineData(OgcGeometryType.MultiPolygon, true)]
    public async Task Should_Destructure_NetTopologySuite_Geometry(OgcGeometryType type, bool threeD)
    {
        var geometry = new FeatureFactory().CreateRandomGeometry(type, threeD);

        using var _ = CaptureLogs(out var logs);
        Logger.LogInformation("This is just a test {@Data}", geometry);
        await Verify(logs.Select(z => z.RenderMessage())).UseParameters(type, threeD);
    }
Exemple #6
0
    private string GetStyle(OgcGeometryType geometryType, string color, bool isText, Dictionary <String, String> styles)
    {
        string r = color.ToLower().Substring(1, 2);
        string g = color.ToLower().Substring(3, 2);
        string b = color.ToLower().Substring(5, 2);

        color = b + g + r;

        string styleId = null;

        switch (geometryType)
        {
        case OgcGeometryType.Point:
            if (isText)
            {
                styleId = "T" + color;

                if (!styles.ContainsKey(styleId))
                {
                    styles.Add(styleId, String.Format("<Style id=\"{0}\"><IconStyle><scale>0.00001</scale></IconStyle><LabelStyle><color>ff{1}</color></LabelStyle></Style>", styleId, color));
                }
            }
            else
            {
                styleId = "P" + color;

                if (!styles.ContainsKey(styleId))
                {
                    styles.Add(styleId, String.Format("<Style id=\"{0}\"><IconStyle><color>ff{1}</color><Icon><href>http://maps.google.com/mapfiles/kml/pal4/icon57.png</href></Icon></IconStyle></Style>", styleId, color));
                }
            }
            break;

        case OgcGeometryType.LineString:
            styleId = "L" + color;

            if (!styles.ContainsKey(styleId))
            {
                styles.Add(styleId, String.Format("<Style id=\"{0}\"><LineStyle><color>ff{1}</color><width>2</width></LineStyle></Style>", styleId, color));
            }
            break;

        case OgcGeometryType.Polygon:
            styleId = "A" + color;

            if (!styles.ContainsKey(styleId))
            {
                styles.Add(styleId, String.Format("<Style id=\"{0}\"><PolyStyle><color>80{1}</color></PolyStyle><LineStyle><color>ff{1}</color><width>2</width></LineStyle></Style>", styleId, color));
            }
            break;
        }

        return(styleId);
    }
Exemple #7
0
    private DataTable GetShapeTable(string sql, OgcGeometryType geometryType)
    {
        DataTable table = null;

        using (OleDbConnection connection = AppContext.GetDatabaseConnection())
        {
            table = new DataTable();

            using (OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection))
            {
                adapter.Fill(table);
            }

            table.Columns["Shape"].ColumnName = "ShapeString";

            switch (geometryType)
            {
            case OgcGeometryType.Point: table.Columns.Add("Shape", typeof(IPoint)); break;

            case OgcGeometryType.LineString: table.Columns.Add("Shape", typeof(IMultiLineString)); break;

            case OgcGeometryType.Polygon: table.Columns.Add("Shape", typeof(IMultiPolygon)); break;
            }

            WKTReader wktReader = new WKTReader();

            foreach (DataRow row in table.Rows)
            {
                switch (geometryType)
                {
                case OgcGeometryType.Point:
                    row["Shape"] = (IPoint)wktReader.Read((string)row["ShapeString"]);
                    break;

                case OgcGeometryType.LineString:
                    ILineString      lineString      = (ILineString)wktReader.Read((string)row["ShapeString"]);
                    IMultiLineString multiLineString = new MultiLineString(new ILineString[] { lineString });
                    row["Shape"] = multiLineString;
                    break;

                case OgcGeometryType.Polygon:
                    IPolygon      polygon      = (IPolygon)wktReader.Read((string)row["ShapeString"]);
                    IMultiPolygon multiPolygon = new MultiPolygon(new IPolygon[] { polygon });
                    row["Shape"] = multiPolygon;
                    break;
                }
            }

            table.Columns.Remove("ShapeString");
        }

        return(table);
    }
        private IEnumerable <Coordinate[]> WriteFeature(JsonWriter writer, JsonSerializer serializer, IFeature feature)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }
            if (serializer == null)
            {
                throw new ArgumentNullException("serializer");
            }
            if (feature == null)
            {
                throw new ArgumentNullException("feature");
            }

            Coordinate[][] arcs;
            writer.WriteStartObject();
            IGeometry geom = feature.Geometry;

            writer.WritePropertyName("type");
            writer.WriteValue(geom.GeometryType);
            OgcGeometryType type = geom.OgcGeometryType;

            switch (type)
            {
            case OgcGeometryType.Point:
                WriteGeom(writer, serializer, (IPoint)geom);
                arcs = null;
                break;

            case OgcGeometryType.LineString:
                arcs = WriteGeom(writer, (ILineString)geom);
                break;

            case OgcGeometryType.Polygon:
                arcs = WriteGeom(writer, (IPolygon)geom);
                break;

            default:
                string err = String.Format("type unsupported: {0}", type);
                throw new ArgumentOutOfRangeException(err);
            }
            // properties
            writer.WritePropertyName("properties");
            serializer.Serialize(writer, feature.Attributes);

            writer.WriteEndObject();
            return(arcs);
        }
Exemple #9
0
        public PostGis_Provider(IGeometryFactory geometryFactory, string connectionString,
                                string tableSchema, string tableName, string oidColumn, string geometryColumn)
            : base(
                new PostGis_Utility(), geometryFactory, connectionString, tableSchema,
                tableName,
                oidColumn,
                geometryColumn)
        {
            using (NpgsqlConnection cn = new NpgsqlConnection(connectionString))
            {
                cn.Open();
                try
                {
                    String selectClause = string.Format("SELECT type, srid FROM {0}.geometry_columns WHERE (f_table_name='{1}' AND f_geometry_column='{2}')",
                                                        tableSchema, tableName, geometryColumn);
                    NpgsqlDataReader dr = new NpgsqlCommand(selectClause, cn).ExecuteReader();
                    if (dr.HasRows)
                    {
                        dr.Read();
                        //valid geometry type
                        _validGeometryType = parseGeometryType(dr.GetString(0));

                        //Srid
                        Srid = dr.GetInt32(1).ToString();
                        if (geometryFactory.Srid == null)
                        {
                            geometryFactory.Srid = Srid;
                        }
                        else
                        {
                            //geometryFactory.SpatialReference
                        }
                    }
                    else
                    {
                        dr.Close();
                        selectClause       = string.Format("SELECT ST_SRID({0}) FROM {1}.{2} LIMIT 1;", geometryColumn, tableSchema, tableName);
                        Srid               = ((Int32) new NpgsqlCommand(selectClause, cn).ExecuteScalar()).ToString();
                        _validGeometryType = OgcGeometryType.Geometry;
                    }
                }
                catch (Exception)
                {
                    _validGeometryType = OgcGeometryType.Unknown;
                }
            }
        }
            public static IGeometryCollection CreateShapes(OgcGeometryType type, Ordinates ordinates, int number = 50)
            {
                var empty = new bool[number];

                empty[Rnd.Next(2, number / 2)]      = true;
                empty[Rnd.Next(number / 2, number)] = true;

                var result = new IGeometry[number];

                for (var i = 0; i < number; i++)
                {
                    switch (type)
                    {
                    case OgcGeometryType.Point:
                        result[i] = CreatePoint(ordinates, empty[i]);
                        break;

                    case OgcGeometryType.MultiPoint:
                        result[i] = CreateMultiPoint(ordinates, empty[i]);
                        break;

                    case OgcGeometryType.LineString:
                    case OgcGeometryType.MultiLineString:
                        result[i] = CreateLineal(ordinates, empty[i]);
                        break;

                    case OgcGeometryType.Polygon:
                    case OgcGeometryType.MultiPolygon:
                        result[i] = CreatePolygonal(ordinates, empty[i]);
                        break;
                    }

                    /*
                     * // Ensure no empty elements
                     * if (result[i] == null || (result[i].IsEmpty && result[i].OgcGeometryType == OgcGeometryType.GeometryCollection))
                     *  i--;
                     */
                    // Ensure not null and not geometry collection
                    if (result[i] == null || result[i].OgcGeometryType == OgcGeometryType.GeometryCollection)
                    {
                        i--;
                    }
                }

                return(Factory.CreateGeometryCollection(result));
            }
Exemple #11
0
        public void DrawOutline(Map map, IGraphics g, IGeometry geom, IStyle style)
        {
            Validate(map, g, geom, style);
            VectorStyle     s    = (VectorStyle)style;
            OgcGeometryType type = geom.OgcGeometryType;

            switch (type)
            {
            case OgcGeometryType.LineString:
                DrawLineString(g, (ILineString)geom, s.Outline, map, s.LineOffset);
                break;

            case OgcGeometryType.MultiLineString:
                DrawMultiLineString(g, (IMultiLineString)geom, s.Outline, map, s.LineOffset);
                break;
            }
        }
Exemple #12
0
        public static ShapeType ToShapeType(this OgcGeometryType ogcGeoType)
        {
            switch (ogcGeoType)
            {
            case OgcGeometryType.Point:
                return(ShapeType.Point);

            case OgcGeometryType.Polygon:
                return(ShapeType.Polygon);

            case OgcGeometryType.LineString:
                return(ShapeType.Polyline);

            default:
                return(ShapeType.NullShape);
            }
        }
Exemple #13
0
        /// <summary>
        /// Inititalizes this instance based on an <see cref="OgcGeometryType"/> and an SRID indicator
        /// </summary>
        /// <param name="ogcGeometryType">The OGC geometry type</param>
        /// <param name="ordinates">The ordinates flag.</param>
        /// <param name="hasSrid">Indicator if a SRID is supplied.</param>
        public GeometryType(OgcGeometryType ogcGeometryType, Ordinates ordinates, bool hasSrid)
        {
            _geometrytype = (uint)ogcGeometryType;

            if ((ordinates & Ordinates.Z) != 0)
            {
                HasWkbZ  = true;
                HasEwkbM = true;
            }

            if ((ordinates & Ordinates.M) != 0)
            {
                HasWkbZ  = true;
                HasEwkbM = true;
            }

            HasEwkbSrid = hasSrid;
        }
        internal static object ToDb2GeometryType(OgcGeometryType geometryType)
        {
            switch (geometryType)
            {
            case OgcGeometryType.Geometry:
            case OgcGeometryType.Point:
            case OgcGeometryType.LineString:
            case OgcGeometryType.Polygon:
            case OgcGeometryType.MultiLineString:
            case OgcGeometryType.MultiPoint:
            case OgcGeometryType.MultiPolygon:
            case OgcGeometryType.GeometryCollection:
                return(string.Format("ST_{0}", geometryType.ToString().ToUpper()));

            default:
                throw new ArgumentException(String.Format("Invalid geometry type: {0}", geometryType));
            }
        }
        /// <summary>
        /// Inititalizes this instance based on an <see cref="OgcGeometryType"/> and an SRID indicator
        /// </summary>
        /// <param name="ogcGeometryType">The OGC geometry type</param>
        /// <param name="ordinates">The ordinates flag.</param>
        /// <param name="hasSrid">Indicator if a SRID is supplied.</param>
        public GeometryType(OgcGeometryType ogcGeometryType, Ordinates ordinates, bool hasSrid)
        {
            _geometrytype = (uint) ogcGeometryType;
            
            if ((ordinates & Ordinates.Z) != 0)
            {
                HasWkbZ = true;
                HasEwkbM = true;
            }

            if ((ordinates & Ordinates.M) != 0)
            {
                HasWkbZ = true;
                HasEwkbM = true;
            }

            HasEwkbSrid = hasSrid;
        }
Exemple #16
0
//    [InlineData(OgcGeometryType.MultiPolygon, 5, true)]
    public async Task Should_Destructure_NetTopologySuite_FeatureCollection(OgcGeometryType type, int num, bool threeD)
    {
        var fc = new FeatureCollection();

        for (var i = 0; i < num; i++)
        {
            fc.Add(
                FeatureFactory.Create(
                    type, threeD, ("id", TypeCode.Int32),
                    ("label", TypeCode.String), ("number1", TypeCode.Double),
                    ("number2", TypeCode.Int64)
                    )
                );
        }

        using var _ = CaptureLogs(out var logs);
        Logger.LogInformation("This is just a test {@Data}", fc);
        await Verify(logs.Select(z => z.RenderMessage())).UseParameters(type, num, threeD);
    }
        private static DSFeatureType ToDotSpatial(this OgcGeometryType self)
        {
            switch (self)
            {
            case OgcGeometryType.Point:
                return(DSFeatureType.Point);

            case OgcGeometryType.MultiPoint:
                return(DSFeatureType.MultiPoint);

            case OgcGeometryType.Polygon:
            case OgcGeometryType.MultiPolygon:
                return(DSFeatureType.Polygon);

            case OgcGeometryType.LineString:
            case OgcGeometryType.MultiLineString:
                return(DSFeatureType.Line);

            default:
                return(DSFeatureType.Unspecified);
            }
        }
Exemple #18
0
 /// <summary>
 /// Inititalizes this instance based on an <see cref="OgcGeometryType"/> and an SRID indicator
 /// </summary>
 /// <param name="ogcGeometryType">The OGC geometry type</param>
 /// <param name="hasSrid">Indicator if a SRID is supplied.</param>
 public GeometryType(OgcGeometryType ogcGeometryType, bool hasSrid)
     : this(ogcGeometryType, Ordinates.XY, hasSrid)
 {
 }
Exemple #19
0
        public void Draw(Map map, IGraphics g, IGeometry geom, IStyle style, bool clip)
        {
            Validate(map, g, geom, style);

            VectorStyle     s    = (VectorStyle)style;
            OgcGeometryType type = geom.OgcGeometryType;

            switch (type)
            {
            case OgcGeometryType.Point:
                if (s.PointSymbolizer != null)
                {
                    DrawPoint(s.PointSymbolizer, g, (IPoint)geom, map);
                    return;
                }
                if (s.Symbol != null || s.PointColor == null)
                {
                    DrawPoint(g, (IPoint)geom, s.Symbol, s.SymbolScale, s.SymbolOffset,
                              s.SymbolRotation, map);
                    return;
                }
                DrawPoint(g, (IPoint)geom, s.PointColor, s.PointSize, s.SymbolOffset, map);
                break;

            case OgcGeometryType.MultiPoint:
                if (s.PointSymbolizer != null)
                {
                    DrawMultiPoint(s.PointSymbolizer, g, (IMultiPoint)geom, map);
                }
                if (s.Symbol != null || s.PointColor == null)
                {
                    DrawMultiPoint(g, (IMultiPoint)geom, s.Symbol, s.SymbolScale, s.SymbolOffset, s.SymbolRotation, map);
                }
                else
                {
                    DrawMultiPoint(g, (IMultiPoint)geom, s.PointColor, s.PointSize, s.SymbolOffset, map);
                }
                break;

            case OgcGeometryType.LineString:
                if (s.LineSymbolizer != null)
                {
                    s.LineSymbolizer.Render(map, (ILineString)geom, g);
                    return;
                }
                DrawLineString(g, (ILineString)geom, s.Line, map, s.LineOffset);
                return;

            case OgcGeometryType.MultiLineString:
                if (s.LineSymbolizer != null)
                {
                    s.LineSymbolizer.Render(map, (IMultiLineString)geom, g);
                    return;
                }
                DrawMultiLineString(g, (IMultiLineString)geom, s.Line, map, s.LineOffset);
                break;

            case OgcGeometryType.Polygon:
                if (s.EnableOutline)
                {
                    DrawPolygon(g, (IPolygon)geom, s.Fill, s.Outline, clip, map);
                }
                else
                {
                    DrawPolygon(g, (IPolygon)geom, s.Fill, null, clip, map);
                }
                break;

            case OgcGeometryType.MultiPolygon:
                if (s.EnableOutline)
                {
                    DrawMultiPolygon(g, (IMultiPolygon)geom, s.Fill, s.Outline, clip, map);
                }
                else
                {
                    DrawMultiPolygon(g, (IMultiPolygon)geom, s.Fill, null, clip, map);
                }
                break;

            case OgcGeometryType.GeometryCollection:
                IGeometryCollection coll = (IGeometryCollection)geom;
                for (int i = 0; i < coll.NumGeometries; i++)
                {
                    Draw(map, g, coll[i], s, clip);
                }
                break;
            }
        }
Exemple #20
0
        /// <summary>
        /// Creates an OGR data source from a FeatureDataTable
        /// </summary>
        /// <param name="table">The name of the table</param>
        /// <param name="geometryType">The geometry type</param>
        /// <param name="driver">The driver</param>
        /// <param name="connection">The connection string</param>
        /// <param name="driverOptions">The options for the driver</param>
        /// <param name="layerOptions">The options for the layer</param>
        public static void CreateFromFeatureDataTable(FeatureDataTable table,
                                                      OgcGeometryType geometryType, int srid, string driver, string connection, string[] driverOptions = null, string[] layerOptions = null)
        {
            if (table == null)
            {
                throw new ArgumentNullException("table");
            }

            if (table.Rows.Count == 0)
            {
                throw new ArgumentException("The table contains no rows", "table");
            }

            if (geometryType < OgcGeometryType.Point || geometryType > OgcGeometryType.MultiPolygon)
            {
                throw new ArgumentException("Invalid geometry type", "geometryType");
            }

            if (string.IsNullOrWhiteSpace(driver))
            {
                throw new ArgumentException("No driver specified", "driver");
            }

            var dr = OSGeo.OGR.Ogr.GetDriverByName(driver);

            if (dr == null)
            {
                throw new Exception(string.Format("Cannot load driver '{0}'!", driver));
            }

            //if (!dr.TestCapability("ODrCCreateDataSource"))
            //    throw new Exception(string.Format("Driver '{0}' cannot create a data source!", driver));

            // Create the data source
            var ds = dr.CreateDataSource(connection, driverOptions);
            //if (!ds.TestCapability("ODsCCreateLayer"))
            //    throw new Exception(string.Format("Driver '{0}' cannot create a layer!", driver));

            // Create the spatial reference
            var sr = new OSGeo.OSR.SpatialReference(string.Empty);

            sr.ImportFromEPSG(srid);

            // Create the layer
            var lyr = ds.CreateLayer(table.TableName, sr, (OgrGeometryType)geometryType, layerOptions);

            sr.Dispose();

            //lyr.GetSpatialRef();
            foreach (System.Data.DataColumn dc in table.Columns)
            {
                using (var fldDef = GetFieldDefinition(dc))
                    lyr.CreateField(fldDef, 0);
            }

            using (var ld = lyr.GetLayerDefn())
            {
                foreach (FeatureDataRow fdr in table.Rows)
                {
                    if ((int)fdr.Geometry.OgcGeometryType != (int)geometryType)
                    {
                        continue;
                    }

                    using (var feature = new OgrFeature(ld))
                    {
                        feature.SetGeometry(OgrGeometry.CreateFromWkb(fdr.Geometry.AsBinary()));
                        var idx = -1;
                        foreach (System.Data.DataColumn dc in table.Columns)
                        {
                            idx++;
                            var      fd = ld.GetFieldDefn(idx);
                            DateTime dt;
                            switch (fd.GetFieldType())
                            {
                            case OgrFieldType.OFTBinary:
                                //Nothing
                                break;

                            case OgrFieldType.OFTDate:
                                dt = ((DateTime)fdr[dc]).Date;
                                feature.SetField(idx, dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, 0);
                                break;

                            case OgrFieldType.OFTDateTime:
                                dt = (DateTime)fdr[dc];
                                feature.SetField(idx, dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, 0);
                                break;

                            case OgrFieldType.OFTTime:
                                var tod = ((DateTime)fdr[dc]).TimeOfDay;
                                feature.SetField(idx, 0, 0, 0, tod.Hours, tod.Minutes, tod.Seconds, 0);
                                break;

                            case OgrFieldType.OFTInteger:
                                feature.SetField(idx, Convert.ToInt32(fdr[dc]));
                                break;

                            case OgrFieldType.OFTIntegerList:
                                var il = GetIntegerList(fdr[dc], dc.DataType);
                                feature.SetFieldIntegerList(idx, il.Length, il);
                                break;

                            case OgrFieldType.OFTReal:
                                feature.SetField(idx, Convert.ToDouble(fdr[dc]));
                                break;

                            case OgrFieldType.OFTRealList:
                                var dl = GetDoubleList(fdr[dc], dc.DataType);
                                feature.SetFieldDoubleList(idx, dl.Length, dl);
                                break;

                            case OgrFieldType.OFTString:
                                feature.SetField(idx, Convert.ToString(fdr[dc]));
                                break;

                            case OgrFieldType.OFTStringList:
                                var sl = (string[])fdr[dc];
                                feature.SetFieldStringList(idx, sl);
                                break;
                            }
                            fd.Dispose();
                        }
                        lyr.CreateFeature(feature);
                        feature.Dispose();
                    }
                    //ld.Dispose();
                }
            }

            lyr.Dispose();
            ds.Dispose();
            dr.Dispose();
        }
Exemple #21
0
 /// <summary>
 /// Inititalizes this instance based on an <see cref="OgcGeometryType"/>
 /// </summary>
 /// <param name="ogcGeometryType">The OGC geometry type</param>
 public GeometryType(OgcGeometryType ogcGeometryType)
     : this(ogcGeometryType, Ordinates.XY, false)
 {
 }
Exemple #22
0
    private void DrawFeatures(Graphics graphics, string layerId, StringCollection ids, Color color, double opacity, string polygonMode, int penWidth, int dotSize)
    {
        if (ids.Count == 0)
        {
            return;
        }

        bool drawPolygonOutlines = polygonMode == "outline";

        // get the layer

        Configuration config = AppContext.GetConfiguration();

        Configuration.LayerRow layerRow = config.Layer.FindByLayerID(layerId);

        CommonDataFrame dataFrame = AppContext.GetDataFrame(_appState.MapTab);
        CommonLayer     layer     = dataFrame.Layers.FirstOrDefault(lyr => String.Compare(lyr.Name, layerRow.LayerName, true) == 0);

        // build the query string and select the features

        CommonField field     = layer.FindField(layerRow.KeyField);
        string      joinedIds = field.IsNumeric ? ids.Join(",") : String.Format("'{0}'", ids.Join("','"));
        string      query     = String.Format("{0} in ({1})", field.Name, joinedIds);

        string levelQuery = layerRow.GetLevelQuery(layer, _appState.Level);

        if (!String.IsNullOrEmpty(levelQuery))
        {
            query += " and " + levelQuery;
        }

        CommonField keyField = layer.FindField(layerRow.KeyField);
        DataTable   table    = layer.GetFeatureTable(String.Format("{0},{1}", layer.GeometryField.Name, keyField.Name), query);

        if (table == null || table.Rows.Count == 0)
        {
            return;
        }

        OgcGeometryType geometryType = ((IGeometry)table.Rows[0][layer.GeometryField.Name]).OgcGeometryType;

        // prepare the temporary image for drawing transparent highlight graphics

        int width  = Convert.ToInt32(graphics.VisibleClipBounds.Width);
        int height = Convert.ToInt32(graphics.VisibleClipBounds.Height);

        Bitmap   bitMap        = new Bitmap(width, height);
        Graphics imageGraphics = Graphics.FromImage(bitMap);

        imageGraphics.Clear(Color.Transparent);

        // prepare the drawing objects

        Brush brush = new SolidBrush(color);
        Pen   pen   = new Pen(color, Convert.ToSingle(penWidth * _resolution));

        pen.EndCap   = System.Drawing.Drawing2D.LineCap.Square;
        pen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;
        Pen bufferPen = new Pen(color, Convert.ToSingle(5 * _resolution));

        bufferPen.EndCap   = System.Drawing.Drawing2D.LineCap.Round;
        bufferPen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;

        float dot = Convert.ToSingle(dotSize * _resolution);

        // draw each shape in the table

        foreach (DataRow row in table.Rows)
        {
            switch (geometryType)
            {
            case OgcGeometryType.Point:
                IPoint point = (IPoint)row[layer.GeometryField.Name];
                DrawPoint(imageGraphics, point, brush, dot);
                break;

            case OgcGeometryType.MultiPoint:
                IMultiPoint multiPoint = (IMultiPoint)row[layer.GeometryField.Name];
                DrawPoint(imageGraphics, (IPoint)multiPoint[0], brush, dot);
                break;

            case OgcGeometryType.MultiLineString:
                DrawMultiLineString(imageGraphics, (IMultiLineString)row[layer.GeometryField.Name], pen);
                break;

            case OgcGeometryType.MultiPolygon:
                if (drawPolygonOutlines)
                {
                    DrawMultiPolygon(imageGraphics, (IMultiPolygon)row[layer.GeometryField.Name], null, null, pen);
                }
                else
                {
                    DrawMultiPolygon(imageGraphics, (IMultiPolygon)row[layer.GeometryField.Name], brush, bufferPen);
                }

                break;
            }
        }

        // draw the temporary image containing the highlight graphics on the output image at
        // the specified opacity

        float[][] matrixItems =
        {
            new float[] { 1, 0, 0,                         0, 0 },
            new float[] { 0, 1, 0,                         0, 0 },
            new float[] { 0, 0, 1,                         0, 0 },
            new float[] { 0, 0, 0, Convert.ToSingle(opacity), 0 },
            new float[] { 0, 0, 0,                         0, 1 }
        };

        ColorMatrix colorMatrix = new ColorMatrix(matrixItems);

        ImageAttributes imageAtts = new ImageAttributes();

        imageAtts.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

        Rectangle drawRect = new Rectangle(0, 0, width, height);

        graphics.DrawImage(bitMap, drawRect, 0, 0, width, height, GraphicsUnit.Pixel, imageAtts);
    }
        public static void CreateDataTable <TOid>(
            FeatureDataTable featureDataTable,
            String tableName,
            String connectionString,
            String geometryColumnName,
            OgcGeometryType geometryType,
            Double smallRasterSize, Double mediumRasterSize, Double largeRasterSize
            )
        {
            DB2Connection conn = new DB2Connection(connectionString);

            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }

            string srid = featureDataTable.GeometryFactory.Srid ?? DefaultSrid;

            if (conn != null)
            {
                try
                {
                    string createTableClause = string.Format("CREATE TABLE \"{0}\".\"{1}\" ({2});",
                                                             DefaultSpatialSchema,
                                                             tableName,
                                                             ColumnsClause(featureDataTable.Columns,
                                                                           featureDataTable.Constraints));

                    new DB2Command(createTableClause, conn).ExecuteNonQuery();

                    new DB2Command(string.Format("ALTER TABLE \"{0}\".\"{1}\" ADD COLUMN \"{2}\" \"{0}\".{3};",
                                                 DefaultSpatialSchema, tableName, geometryColumnName,
                                                 ToDb2GeometryType(geometryType)), conn).ExecuteNonQuery();

                    Object db2crsname = new DB2Command(String.Format(
                                                           @"SELECT DISTINCT SPATIAL_REF_SYS.CS_NAME
   FROM ""{0}"".""SPATIAL_REF_SYS"" AS SPATIAL_REF_SYS
   WHERE SPATIAL_REF_SYS.AUTH_SRID = {1};",
                                                           DefaultSpatialSchema,
                                                           srid),
                                                       conn).ExecuteScalar();

                    if (db2crsname == null || db2crsname == DBNull.Value || ((String)db2crsname).Length == 0)
                    {
                        db2crsname = "DEFAULT_SRS";
                    }

                    //register spatial column
                    DB2Command cmd =
                        new DB2Command(String.Format("CALL \"{0}\".ST_REGISTER_SPATIAL_COLUMN(?,?,?,?,?,?);",
                                                     DefaultSpatialSchema),
                                       conn);
                    //cmd.CommandType = CommandType.StoredProcedure;

                    //input parameters
                    //DB2Parameter par;
                    DB2Parameter par1 = cmd.Parameters.Add(new DB2Parameter("@P1", DB2Type.VarChar, 130));
                    par1.Value = "\"" + DefaultSpatialSchema + "\"";
                    DB2Parameter par2 = cmd.Parameters.Add(new DB2Parameter("@P2", DB2Type.VarChar, 130));
                    par2.Value = "\"" + tableName + "\"";
                    DB2Parameter par3 = cmd.Parameters.Add(new DB2Parameter("@P3", DB2Type.VarChar, 130));
                    par3.Value = "\"" + geometryColumnName + "\"";
                    DB2Parameter par4 = cmd.Parameters.Add(new DB2Parameter("@P4", DB2Type.VarChar, 130));
                    par4.Value = "\"" + db2crsname + "\"";

                    //output parameters
                    DB2Parameter par5 = cmd.Parameters.Add(new DB2Parameter("@P5", DB2Type.Integer, 4));
                    par5.Direction = ParameterDirection.Output;
                    DB2Parameter par6 = cmd.Parameters.Add(new DB2Parameter("@P6", DB2Type.VarChar, 1024));
                    par6.Direction = ParameterDirection.Output;

                    cmd.ExecuteNonQuery();

                    if (smallRasterSize != -1d)
                    {
                        //adding spatial index
                        new DB2Command(
                            String.Format(
                                "CREATE INDEX \"{0}\".\"idx_{1}_{2}\" ON \"{0}\".\"{1}\"(\"{2}\") EXTEND USING \"{0}\".({3}, {4}, {5});",
                                DefaultSpatialSchema,
                                tableName,
                                geometryColumnName,
                                smallRasterSize, mediumRasterSize, largeRasterSize),
                            conn).ExecuteNonQuery();
                    }
                }
                catch (DB2Exception ex)
                {
                    Trace.Write(ex.Message);
                    //throw new DB2SpatialExtenderException(string.Format("Cannot create geometry column with type of '{0}'", geometryType.ToString()));
                }
                catch
                {
                }
            }
            conn.Close();
            conn = null;

            DB2SpatialExtenderProvider <TOid> prov = new DB2SpatialExtenderProvider <TOid>(
                featureDataTable.GeometryFactory, connectionString, DefaultSpatialSchema, tableName,
                featureDataTable.Columns[0].ColumnName, geometryColumnName);

            prov.Insert(featureDataTable);

            return;
        }
            public static IGeometryCollection CreateShapes(OgcGeometryType type, Ordinates ordinates, int number = 50)
            {
                var empty = new bool[number];
                empty[Rnd.Next(2, number / 2)] = true;
                empty[Rnd.Next(number / 2, number)] = true;

                var result = new IGeometry[number];
                for (var i = 0; i < number; i++)
                {
                    switch (type)
                    {
                        case OgcGeometryType.Point:
                            result[i] = CreatePoint(ordinates, empty[i]);
                            break;
                        case OgcGeometryType.MultiPoint:
                            result[i] = CreateMultiPoint(ordinates, empty[i]);
                            break;

                        case OgcGeometryType.LineString:
                        case OgcGeometryType.MultiLineString:
                            result[i] = CreateLineal(ordinates, empty[i]);
                            break;
                        case OgcGeometryType.Polygon:
                        case OgcGeometryType.MultiPolygon:
                            result[i] = CreatePolygonal(ordinates, empty[i]);
                            break;
                    }

                    /*
                    // Ensure no empty elements
                    if (result[i] == null || (result[i].IsEmpty && result[i].OgcGeometryType == OgcGeometryType.GeometryCollection))
                        i--;
                    */
                    // Ensure not null and not geometry collection
                    if (result[i] == null || result[i].OgcGeometryType == OgcGeometryType.GeometryCollection)
                        i--;
                }

                return Factory.CreateGeometryCollection(result);
            }
  private string GetStyle(OgcGeometryType geometryType, string color, bool isText, Dictionary<String, String> styles)
  {
    string r = color.ToLower().Substring(1, 2);
    string g = color.ToLower().Substring(3, 2);
    string b = color.ToLower().Substring(5, 2);
    color = b + g + r;

    string styleId = null;

    switch (geometryType)
    {
      case OgcGeometryType.Point:
        if (isText)
        {
          styleId = "T" + color;

          if (!styles.ContainsKey(styleId))
          {
            styles.Add(styleId, String.Format("<Style id=\"{0}\"><IconStyle><scale>0.00001</scale></IconStyle><LabelStyle><color>ff{1}</color></LabelStyle></Style>", styleId, color));
          }
        }
        else
        {
          styleId = "P" + color;

          if (!styles.ContainsKey(styleId))
          {
            styles.Add(styleId, String.Format("<Style id=\"{0}\"><IconStyle><color>ff{1}</color><Icon><href>http://maps.google.com/mapfiles/kml/pal4/icon57.png</href></Icon></IconStyle></Style>", styleId, color));
          }
        }
        break;

      case OgcGeometryType.LineString:
        styleId = "L" + color;

        if (!styles.ContainsKey(styleId))
        {
          styles.Add(styleId, String.Format("<Style id=\"{0}\"><LineStyle><color>ff{1}</color><width>2</width></LineStyle></Style>", styleId, color));
        }
        break;

      case OgcGeometryType.Polygon:
        styleId = "A" + color;

        if (!styles.ContainsKey(styleId))
        {
          styles.Add(styleId, String.Format("<Style id=\"{0}\"><PolyStyle><color>80{1}</color></PolyStyle><LineStyle><color>ff{1}</color><width>2</width></LineStyle></Style>", styleId, color));
        }
        break;
    }

    return styleId;
  }
        /// <summary>
        /// Inititalizes this instance based on an <see cref="OgcGeometryType"/>
        /// </summary>
        /// <param name="ogcGeometryType">The OGC geometry type</param>
        public GeometryType(OgcGeometryType ogcGeometryType)
            : this(ogcGeometryType, Ordinates.XY, false)
        {

        }
Exemple #27
0
 /// <summary>
 /// Create a new geo feature.
 /// </summary>
 /// <param name="_GeoCoordinates">A list of geo coordinates.</param>
 /// <param name="_Type">The type of the feature.</param>
 public GeoFeature(IEnumerable <Coordinate> _GeoCoordinates,
                   OgcGeometryType _Type = OgcGeometryType.Point)
 {
     GeoCoordinates = new List <Coordinate>(_GeoCoordinates);
     Type           = _Type;
 }
 public IGeometry CreateGeometry(ICoordinateSequence coordinates, OgcGeometryType type)
 {
     switch (type)
     {
         case OgcGeometryType.Point:
             return CreatePoint(coordinates);
         case OgcGeometryType.LineString:
             return CreateLineString(coordinates);
         case OgcGeometryType.Polygon:
             return CreatePolygon(coordinates);
         case OgcGeometryType.MultiPoint:
             return CreateMultiPoint(coordinates);
         case OgcGeometryType.MultiPolygon:
             return CreateMultiPolygon(coordinates);
         case OgcGeometryType.MultiLineString:
         case OgcGeometryType.GeometryCollection:
         case OgcGeometryType.Geometry:
         case OgcGeometryType.Curve:
         case OgcGeometryType.Surface:
         case OgcGeometryType.MultiSurface:
         case OgcGeometryType.MultiCurve:
         default:
             throw new NotSupportedException("Geometry type not supported: " + type);
     }
 }
  private DataTable GetShapeTable(string sql, OgcGeometryType geometryType)
  {
    DataTable table = null;

    using (OleDbConnection connection = AppContext.GetDatabaseConnection())
    {
      table = new DataTable();

      using (OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection))
      {
        adapter.Fill(table);
      }

      table.Columns["Shape"].ColumnName = "ShapeString";

      switch (geometryType)
      {
        case OgcGeometryType.Point: table.Columns.Add("Shape", typeof(IPoint)); break;
        case OgcGeometryType.LineString: table.Columns.Add("Shape", typeof(IMultiLineString)); break;
        case OgcGeometryType.Polygon: table.Columns.Add("Shape", typeof(IMultiPolygon)); break;
      }

      WKTReader wktReader = new WKTReader();

      foreach (DataRow row in table.Rows)
      {
        switch (geometryType)
        {
          case OgcGeometryType.Point:
            row["Shape"] = (IPoint)wktReader.Read((string)row["ShapeString"]);
            break;

          case OgcGeometryType.LineString:
            ILineString lineString = (ILineString)wktReader.Read((string)row["ShapeString"]);
            IMultiLineString multiLineString = new MultiLineString(new ILineString[] { lineString });
            row["Shape"] = multiLineString;
            break;

          case OgcGeometryType.Polygon:
            IPolygon polygon = (IPolygon)wktReader.Read((string)row["ShapeString"]);
            IMultiPolygon multiPolygon = new MultiPolygon(new IPolygon[] { polygon });
            row["Shape"] = multiPolygon;
            break;
        }
      }

      table.Columns.Remove("ShapeString");
    }

    return table;
  }
 /// <summary>
 /// Inititalizes this instance based on an <see cref="OgcGeometryType"/> and an SRID indicator
 /// </summary>
 /// <param name="ogcGeometryType">The OGC geometry type</param>
 /// <param name="hasSrid">Indicator if a SRID is supplied.</param>
 public GeometryType(OgcGeometryType ogcGeometryType, bool hasSrid)
     :this(ogcGeometryType, Ordinates.XY, hasSrid)
 {
 }
        public DB2SpatialExtenderProvider(IGeometryFactory geometryFactory, string connectionString,
                                          string tableSchema, string tableName, string oidColumn, string geometryColumn)
            : base(
                new DB2SpatialExtenderDbUtility(), geometryFactory, connectionString, tableSchema,
                tableName,
                oidColumn,
                geometryColumn)
        {
            using (DB2Connection cn = new DB2Connection(connectionString))
            {
                cn.Open();
                cn.CacheData = true;
                try
                {
                    String selectClause =
                        string.Format(
                            @"
SELECT SGC.TYPE_NAME, SGC.SRS_ID
    FROM {0}.ST_GEOMETRY_COLUMNS AS SGC
    WHERE (SGC.TABLE_SCHEMA='{1}' AND SGC.TABLE_NAME='{2}' AND SGC.COLUMN_NAME='{3}')",
                            DB2SpatialExtenderProviderStatic.DefaultSpatialSchema,
                            tableSchema,
                            tableName,
                            geometryColumn);

                    DB2DataReader dr = new DB2Command(selectClause, cn).ExecuteReader();
                    if (dr.HasRows)
                    {
                        dr.Read();
                        //valid geometry type
                        _validGeometryType = parseGeometryType(dr.GetString(0));

                        //SrsId
                        DB2SrsId = dr.GetDB2Int32(1).Value;
                        if (!OriginalSpatialReference.EqualParams(GeometryFactory.SpatialReference))
                        {
                            GeometryFactory.SpatialReference = OriginalSpatialReference;
                        }
                        //OriginalSrid = dr[1].ToString();
                        if (geometryFactory.Srid == null)
                        {
                            geometryFactory.Srid = OriginalSrid;
                        }
                        else
                        {
                            //geometryFactory.SpatialReference
                        }
                    }
                    else
                    {
                        dr.Close();
                        selectClause =
                            string.Format(@"
SELECT {0}.ST_SRID({1})
    FROM {2} AS {3} 
    WHERE ({4}=MIN({4}));",
                                          DB2SpatialExtenderProviderStatic.DefaultSpatialSchema,
                                          QualifyColumnName(geometryColumn),
                                          QualifyTableName(tableSchema, tableName),
                                          tableName,
                                          QualifyColumnName(oidColumn));

                        OriginalSrid       = ((Int32) new DB2Command(selectClause, cn).ExecuteScalar()).ToString();
                        _validGeometryType = OgcGeometryType.Geometry;
                    }
                }
                catch (Exception)
                {
                    _validGeometryType = OgcGeometryType.Unknown;
                }
            }
        }
Exemple #32
0
    private IGeometry MergeShapes(DataTable table)
    {
        if (table.Rows.Count > 0)
        {
            IEnumerable <DataColumn> columns = table.Columns.Cast <DataColumn>();
            DataColumn      geometryColumn   = columns.First(c => c.DataType.IsSubclassOf(typeof(Geometry)));
            OgcGeometryType geometryType     = ((IGeometry)table.Rows[0][geometryColumn]).OgcGeometryType;

            switch (geometryType)
            {
            case OgcGeometryType.Point:
            case OgcGeometryType.MultiPoint:
                List <IPoint> mergeMultiPoint = new List <IPoint>();

                foreach (DataRow row in table.Rows)
                {
                    if (geometryType == OgcGeometryType.Point)
                    {
                        mergeMultiPoint.Add((IPoint)row[geometryColumn]);
                    }
                    else
                    {
                        IMultiPoint multiPoint = (IMultiPoint)row[geometryColumn];

                        foreach (IPoint p in multiPoint)
                        {
                            mergeMultiPoint.Add(p);
                        }
                    }
                }

                return(new MultiPoint(mergeMultiPoint.ToArray()));

            case OgcGeometryType.MultiLineString:
                List <ILineString> mergeLineString = new List <ILineString>();

                foreach (DataRow row in table.Rows)
                {
                    IMultiLineString multiLineString = (MultiLineString)row[geometryColumn];

                    foreach (ILineString lineString in multiLineString.Geometries.Cast <ILineString>())
                    {
                        mergeLineString.Add(lineString);
                    }
                }

                return(new MultiLineString(mergeLineString.ToArray()));

            case OgcGeometryType.MultiPolygon:
                List <IPolygon> mergePolygon = new List <IPolygon>();

                foreach (DataRow row in table.Rows)
                {
                    MultiPolygon multiPolygon = (MultiPolygon)row[geometryColumn];

                    foreach (IPolygon polygon in multiPolygon.Geometries.Cast <IPolygon>())
                    {
                        mergePolygon.Add(polygon);
                    }
                }

                return(new MultiPolygon(mergePolygon.ToArray()));
            }
        }

        return(null);
    }
Exemple #33
0
        /// <summary>
        /// Creates an OGR data source from a FeatureDataTable
        /// </summary>
        /// <param name="table">The name of the table</param>
        /// <param name="geometryType">The geometry type</param>
        /// <param name="driver">The driver</param>
        /// <param name="connection">The connection string</param>
        /// <param name="driverOptions">The options for the driver</param>
        /// <param name="layerOptions">The options for the layer</param>
        public static void CreateFromFeatureDataTable(FeatureDataTable table, 
            OgcGeometryType geometryType, int srid, string driver, string connection, string[] driverOptions = null, string[] layerOptions = null)
        {
            if (table == null)
                throw new ArgumentNullException("table");

            if (table.Rows.Count == 0)
                throw new ArgumentException("The table contains no rows", "table");

            if (geometryType < OgcGeometryType.Point || geometryType > OgcGeometryType.MultiPolygon)
                throw new ArgumentException("Invalid geometry type", "geometryType");

            if (string.IsNullOrWhiteSpace(driver))
                throw new ArgumentException("No driver specified", "driver");

            var dr = OSGeo.OGR.Ogr.GetDriverByName(driver);
            if (dr == null)
                throw new Exception(string.Format("Cannot load driver '{0}'!", driver));

            //if (!dr.TestCapability("ODrCCreateDataSource"))
            //    throw new Exception(string.Format("Driver '{0}' cannot create a data source!", driver));

            // Create the data source
            var ds = dr.CreateDataSource(connection, driverOptions);
            //if (!ds.TestCapability("ODsCCreateLayer"))
            //    throw new Exception(string.Format("Driver '{0}' cannot create a layer!", driver));

            // Create the spatial reference
            var sr = new OSGeo.OSR.SpatialReference(string.Empty);
            sr.ImportFromEPSG(srid);

            // Create the layer
            var lyr = ds.CreateLayer(table.TableName, sr, (OgrGeometryType)geometryType, layerOptions);
            sr.Dispose();

            //lyr.GetSpatialRef();
            foreach (System.Data.DataColumn dc in table.Columns)
            {
                using (var fldDef = GetFieldDefinition(dc))
                    lyr.CreateField(fldDef, 0);
            }

            using (var ld = lyr.GetLayerDefn())
            {
                foreach (FeatureDataRow fdr in table.Rows)
                {
                    if ((int)fdr.Geometry.OgcGeometryType != (int)geometryType)
                        continue;

                    using (var feature = new OgrFeature(ld))
                    {
                        feature.SetGeometry(OgrGeometry.CreateFromWkb(fdr.Geometry.AsBinary()));
                        var idx = -1;
                        foreach (System.Data.DataColumn dc in table.Columns)
                        {
                            idx++;
                            var fd = ld.GetFieldDefn(idx);
                            DateTime dt;
                            switch (fd.GetFieldType())
                            {
                                case OgrFieldType.OFTBinary:
                                    //Nothing
                                    break;
                                case OgrFieldType.OFTDate:
                                    dt = ((DateTime)fdr[dc]).Date;
                                    feature.SetField(idx, dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, 0);
                                    break;
                                case OgrFieldType.OFTDateTime:
                                    dt = (DateTime)fdr[dc];
                                    feature.SetField(idx, dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, 0);
                                    break;
                                case OgrFieldType.OFTTime:
                                    var tod = ((DateTime)fdr[dc]).TimeOfDay;
                                    feature.SetField(idx, 0, 0, 0, tod.Hours, tod.Minutes, tod.Seconds, 0);
                                    break;
                                case OgrFieldType.OFTInteger:
                                    feature.SetField(idx, Convert.ToInt32(fdr[dc]));
                                    break;
                                case OgrFieldType.OFTIntegerList:
                                    var il = GetIntegerList(fdr[dc], dc.DataType);
                                    feature.SetFieldIntegerList(idx, il.Length, il);
                                    break;
                                case OgrFieldType.OFTReal:
                                    feature.SetField(idx, Convert.ToDouble(fdr[dc]));
                                    break;
                                case OgrFieldType.OFTRealList:
                                    var dl = GetDoubleList(fdr[dc], dc.DataType);
                                    feature.SetFieldDoubleList(idx, dl.Length, dl);
                                    break;
                                case OgrFieldType.OFTString:
                                    feature.SetField(idx, Convert.ToString(fdr[dc]));
                                    break;
                                case OgrFieldType.OFTStringList:
                                    var sl = (string[])fdr[dc];
                                    feature.SetFieldStringList(idx, sl);
                                    break;

                            }
                            fd.Dispose();
                        }
                        lyr.CreateFeature(feature);
                        feature.Dispose();
                    }
                    //ld.Dispose();
                }
            }

            lyr.Dispose();
            ds.Dispose();
            dr.Dispose();
        }
 public static IFeature Create(OgcGeometryType geometryType, in bool threeD = false, params (string, TypeCode)[] properties)
Exemple #35
0
        public virtual void Insert(IEnumerable <FeatureDataRow <TOid> > features)
        {
            OgcGeometryType geometryType = OgcGeometryType.Unknown;

            using (IDbConnection conn = DbUtility.CreateConnection(ConnectionString))
            {
                if (conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }

                using (IDbTransaction tran = conn.BeginTransaction())
                {
                    IDbCommand cmd = DbUtility.CreateCommand();
                    cmd.Connection  = conn;
                    cmd.Transaction = tran;

                    cmd.CommandText = string.Format(
                        "INSERT INTO {0} {1};", QualifiedTableName, InsertClause(cmd));

                    int geometryParameterIndex = cmd.Parameters.Count - 1;
                    foreach (FeatureDataRow <TOid> row in features)
                    {
                        if (cmd.Parameters.Count > 0)
                        {
                            for (int i = 0; i < row.FieldCount; i++)
                            {
                                ((IDataParameter)cmd.Parameters[i]).Value = row.GetValue(i);
                            }
                            ((IDataParameter)cmd.Parameters[geometryParameterIndex]).Value =
                                row.Geometry.AsBinary();
                        }
                        else
                        {
                            for (int i = 0; i < row.FieldCount; i++)
                            {
                                cmd.Parameters.Add(DbUtility.CreateParameter(string.Format("P{0}", i), row[i],
                                                                             ParameterDirection.Input));
                            }

                            geometryParameterIndex = cmd.Parameters.Add(
                                DbUtility.CreateParameter("PGeo", row.Geometry.AsBinary(),
                                                          ParameterDirection.Input));
                        }

                        //for (int i = 0; i < cmd.Parameters.Count - 1; i++)
                        //    ((IDataParameter)cmd.Parameters[i]).Value = row[i];
                        //byte[] geomBinary = row.Geometry.AsBinary();
                        //((IDataParameter)cmd.Parameters["@PGeo"]).Value = geomBinary;

                        if (geometryType == OgcGeometryType.Unknown)
                        {
                            geometryType = row.Geometry.GeometryType;
                        }

                        if (row.Geometry.GeometryType == geometryType)
                        {
                            cmd.ExecuteNonQuery();
                        }
                    }
                    tran.Commit();
                }
            }
        }
Exemple #36
0
        public static void CreateDataTable <TOid>(
            FeatureDataTable featureDataTable,
            String schemaName,
            String tableName,
            String connectionString,
            String geometryColumnName,
            OgcGeometryType geometryType)
        {
            string srid = featureDataTable.GeometryFactory.SpatialReference != null
                              ?
                          featureDataTable.GeometryFactory.SpatialReference.AuthorityCode
                              :
                          DefaultSridInt.ToString();

            NpgsqlConnectionStringBuilder csb = new NpgsqlConnectionStringBuilder(connectionString);

            PostGisDbUtility util = new PostGisDbUtility();
            NpgsqlConnection conn = (NpgsqlConnection)util.CreateConnection(connectionString);

            if (conn != null)
            {
                try
                {
                    if (conn.State == ConnectionState.Closed)
                    {
                        conn.Open();
                    }

                    if (!Has_X_Privilege(conn, "database", csb.Database, "CREATE"))
                    {
                        throw new PostGisException("Insufficient rights to create table!");
                    }

                    if (!Has_X_Privilege(conn,
                                         "function",
                                         "addgeometrycolumn(character varying, character varying, int, character varying, int)",
                                         "EXECUTE"))
                    {
                        throw new PostGisException("Insufficient rights to access addgeometrycolumn function!");
                    }

                    string createTableClause = string.Format(
                        "CREATE TABLE {0}.\"{1}\" ({2}) WITH(OIDS=FALSE);",
                        schemaName,
                        tableName,
                        ColumnsClause(tableName, featureDataTable.Columns,
                                      featureDataTable.Constraints));

                    new NpgsqlCommand(createTableClause, conn).ExecuteNonQuery();

                    String addGeometryColumnClause = String.Format("('{0}', '{1}', {2}, '{3}', {4})",
                                                                   tableName,
                                                                   geometryColumnName,
                                                                   srid,
                                                                   geometryType.ToString().ToUpper(),
                                                                   2);

                    //adding spatial column
                    new NpgsqlCommand(String.Format("SELECT AddGeometryColumn {0};",
                                                    addGeometryColumnClause),
                                      conn).ExecuteNonQuery();

                    //adding GIST index
                    new NpgsqlCommand(String.Format("CREATE INDEX index_{0}_{1} ON {2}.\"{3}\" USING gist(\"{4}\");",
                                                    tableName,
                                                    geometryColumnName,
                                                    schemaName,
                                                    tableName,
                                                    geometryColumnName),
                                      conn).ExecuteNonQuery();
                }
                catch (NpgsqlException ex)
                {
                    Trace.Write(ex.Message);
                    throw new PostGisException(string.Format("Cannot create geometry column with type of '{0}'",
                                                             geometryType));
                }
                catch
                {
                }
            }
            conn.Close();
            conn = null;

            PostGisProvider <TOid> prov = new PostGisProvider <TOid>(
                featureDataTable.GeometryFactory, connectionString, schemaName, tableName,
                featureDataTable.Columns[0].ColumnName, geometryColumnName);

            prov.Insert(featureDataTable);

            return;
        }