Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create a DbGeography Polygon from a collection of DbGeography Points

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)

like image 981
Drauka Avatar asked Feb 17 '23 08:02

Drauka


2 Answers

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

like image 57
Rich Avatar answered Feb 19 '23 23:02

Rich


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.

like image 39
Drauka Avatar answered Feb 19 '23 22:02

Drauka