Create a DbGeography Polygon from a collection of DbGeography Points

entity-framework geospatial

Question

Can anyone tell me how I can create a DbGeography object of type 'Polygon' from a Collection of DbGeography objects of type 'POINT'

So far I've got this which creates the polygon but I'm missing how the initial step.

1. DbGeography multipoint = DbGeography.MultiPointFromText("MULTIPOINT(53.095124 -0.864716, 53.021255 -1.337128, 52.808019 -1.345367, 52.86153 -1.018524)", 4326)

2. DbGeometry temp_multipoint = DbGeometry.MultiPointFromBinary(multipoint.AsBinary(), 4326)

3. DbGeography polygon = DbGeography.PolygonFromBinary(temp_multipoint.ConvexHull.AsBinary(), 4326); (RESULT)

The problem is creating the initial multipoint geography object from a list of DbGeography(POINTS)

1
3
3/1/2013 1:46:11 PM

Accepted Answer

I did eventually find out how to create a polygon from multiple points without having to create it from WKT. The below explanation is slightly simplified but nonetheless

    var PolygonFromMultiplePoints = new DbGeography();

    using (var db = new LocationContext())
    {
        //Select Locations known to be within a certain area which should define the polygon.
        foreach (var item in db.Locations)
        {
            PolygonFromMultiplePoints.Union(item.GeoLocation);
        }
    }            
    var temp_multipointgeometry = DbGeometry.MultiPointFromBinary(PolygonFromMultiplePoints.AsBinary(), DbGeometry.DefaultCoordinateSystemId);            
    PolygonFromMultiplePoints = DbGeography.PolygonFromBinary(temp_multipointgeometry.ConvexHull.AsBinary(), DbGeography.DefaultCoordinateSystemId);

Code sample assumes that you already have a collection of dbgeography stored as points in the database. My database information was derived from importing locations from GeoNames.

2
9/23/2013 11:39:37 PM

Popular Answer

Create each point as a DbGeography object using WKT:

DbGeography point1 = DbGeography.FromText("POINT(53.095124 -0.864716)", 4326);
DbGeography point2 = DbGeography.FromText("POINT(53.021255 -1.337128)", 4326);
DbGeography point3 = DbGeography.FromText("POINT(52.808019 -1.345367)", 4326);
...
DbGeography polygon = DbGeography.PolygonFromText("POLYGON((53.095124 -0.864716, 53.021255 -1.337128, 52.808019 -1.345367, 53.095124 -0.864716))", 4326);

Two things to note:

  • The WKT format is Longitude then Latitude, not the more intuitive Lat, Long
  • For a polygon, the LAST point must match the FIRST point to "close it off"

Hope this helps - I also battled to learn the polygon stuff!

See this article for extra tips on the WKT format: http://en.wikipedia.org/wiki/Well-known_text



Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow