Polygon.Area - what are the units?

Nov 5, 2013 at 6:05 PM
I am using the following code to construct a polygon object and return the area. My question is what is the area units? i am using a polygon the size of a small town and the result is 0.00489008147093151. I am constructing using wgs84 lat/lng points. any ideas?

Image
Nov 5, 2013 at 6:16 PM
I have followed up with all other reliant posts without avail.
Editor
Nov 5, 2013 at 8:11 PM
if you put in lat/lon coordinates you will get a meaningless area computed from the degree values.
You need to transform your geometry to a projected coordinate system in order to get a reasonable result.
Hth FObermaier
Nov 5, 2013 at 8:20 PM
Thank you FObermaier. I am new to dotspatial. I will see what i can learn regarding the projected coordinate used to construct the polygon. Any good examples i may leverage?
Nov 6, 2013 at 12:31 PM
Edited Nov 6, 2013 at 12:34 PM
I have added the a projected feature set and used it to create the polygon with the same result. Any suggestions?
                    Using t As New DataTable
                        Using myReader As SqlDataReader = sqlCmd.ExecuteReader()
                            t.Load(myReader)
                        End Using
                        'create a new coordinate array
                        Dim coords As Coordinate() = New Coordinate(t.Rows.Count - 1) {}

                        Dim i As Integer = 0
                        For Each r As DataRow In t.Rows
                            coords(i) = New Coordinate(r("Latitude"), r("Longitude"))
                            i  = i+1
                        Next

                        'create the featureset
                        Dim fs As New FeatureSet(FeatureType.Polygon)
                        Dim prjLatLng As ProjectionInfo = KnownCoordinateSystems.Geographic.World.WGS1984
                        fs.Projection = prjLatLng
                        fs.Features.Add(coords, FeatureType.Polygon)

                        'create a new polygon from the coordinate array
                        Dim pg As New Polygon(fs.Features(0).Coordinates)

                        'get the area of the polygon
                        retArea = pg.Area '  what is this area in?

                    End Using
Editor
Nov 6, 2013 at 1:41 PM
you need to reproject it to a projected coordinate system. the one you assigned is geographic. sth Like
fs.Reproject(ProjectionInfo.FromEpsgCode("EPSG:31466"))
retArea =  (IPolygon)fs.Features(0).Area
Nov 6, 2013 at 2:33 PM
Edited Nov 6, 2013 at 2:47 PM
FObermaiar, thank you for the reply!. I revised the code according to your instruction, it seems to be working! here is the working version: My only question is what are the engineering units of the results?
                Using t As New DataTable
                    Using myReader As SqlDataReader = sqlCmd.ExecuteReader()
                        t.Load(myReader)
                    End Using
                    'create a new coordinate array
                    Dim coords As Coordinate() = New Coordinate(t.Rows.Count - 1) {}

                    Dim i As Integer = 0
                    For Each r As DataRow In t.Rows
                        coords(i) = New Coordinate(r("Latitude"), r("Longitude"))
                        i += 1
                    Next

                    'create the featureset
                    Dim fs As New FeatureSet(FeatureType.Polygon)
                    Dim prjLatLng As ProjectionInfo = KnownCoordinateSystems.Geographic.World.WGS1984
                    fs.Projection = prjLatLng
                    fs.Features.Add(coords, FeatureType.Polygon)

                    'reproject grom geographic to projected coordinate system
                    fs.Reproject(KnownCoordinateSystems.Projected.NorthAmerica.NorthAmericaAlbersEqualAreaConic)

                    'create a new polygon from the reprojected coordinate array
                    Dim pg As New Polygon(fs.Features(0).Coordinates)

                    'get the area of the polygon
                    retArea = pg.Area

                End Using

Thank you!
Editor
Nov 6, 2013 at 4:13 PM
Edited Nov 6, 2013 at 6:59 PM
IIRC the projection info object you use has a "Unit" property.
If it's 'Meter' property is ~0.33 you have some square feet.
Nov 6, 2013 at 5:44 PM
Edited Nov 6, 2013 at 5:45 PM
i am not finding this 'k' property in the projectioninfo class here:

Link to documentation

There is something called 'scalefactor' but it appears to be 1.0 in any case. Any suggestions?
Editor
Nov 6, 2013 at 6:49 PM
Edited Nov 6, 2013 at 6:59 PM
It is 'Unit.Meter', sorry. If you call ToProj4String() its value is described as 'to_meter'.
If it is 1.0 I suppose you have square meters.
Nov 6, 2013 at 7:27 PM
Thank you for your help; i am graetful.

Here is my problem, each projection coordinate system results in different area results, but the scale and Unit.Meter remains 1.0 regardless of the projection used.

Any suggestions? Here is the code as of now:
                    Using t As New DataTable
                        Using myReader As SqlDataReader = sqlCmd.ExecuteReader()
                            t.Load(myReader)
                        End Using
                        'create a new coordinate array
                        Dim coords As Coordinate() = New Coordinate(t.Rows.Count - 1) {}

                        Dim i As Integer = 0
                        For Each r As DataRow In t.Rows
                            coords(i) = New Coordinate(r("Latitude"), r("Longitude"))
                            i += 1
                        Next

                        'create the featureset
                        Dim fs As New FeatureSet(FeatureType.Polygon)
                        Dim prjLatLng As ProjectionInfo = KnownCoordinateSystems.Geographic.World.WGS1984
                        fs.Projection = prjLatLng
                        fs.Features.Add(coords, FeatureType.Polygon)

                        'reproject grom geographic to projected coordinate system
                        ' Dim prjProjected As ProjectionInfo = KnownCoordinateSystems.Projected.NorthAmerica.NorthAmericaEquidistantConic
                        Dim prjProjected As ProjectionInfo = KnownCoordinateSystems.Projected.NorthAmerica.USAContiguousLambertConformalConic
                        fs.Reproject(prjProjected)
               
                        'create a new polygon from the reprojected coordinate array
                        Dim pg As New Polygon(fs.Features(0).Coordinates)

                        'get the area of the polygon
                        'mult area by scale
                        retArea = pg.Area * prjProjected.Unit.Meters
                   
                    End Using
Thank you
Editor
Nov 6, 2013 at 8:13 PM
You will get a different value for length and area depending on the projection you use. You need to pick that projection that suits your area of interest best to get the most accurate result.
Developer
Nov 6, 2013 at 8:55 PM
The subject of projections is more complicated than anyone imagines it will be.
A reasonable introduction can be found at:
http://en.wikipedia.org/wiki/Map_projection

A humorous look at some projections is in this comic strip which we have posted in our office:
http://xkcd.com/977/
Nov 11, 2013 at 6:38 PM
okay, figured it out. has to be in the proper projection and you need to use the multiplier squared:
                Using t As New DataTable
                    Using myReader As SqlDataReader = sqlCmd.ExecuteReader()
                        t.Load(myReader)
                    End Using
                    'create a new coordinate array
                    Dim coords As Coordinate() = New Coordinate(t.Rows.Count - 1) {}

                    Dim i As Integer = 0
                    For Each r As DataRow In t.Rows
                        coords(i) = New Coordinate(r("Longitude"), r("Latitude"))
                        i += 1
                    Next

                    'create the featureset
                    Dim fs As New FeatureSet(FeatureType.Polygon)
                    Dim prjLatLng As ProjectionInfo = KnownCoordinateSystems.Geographic.World.WGS1984
                    fs.Projection = prjLatLng
                    fs.Features.Add(coords, FeatureType.Polygon)

                    'reproject grom geographic to projected coordinate system
                    Dim prjProjected As ProjectionInfo = KnownCoordinateSystems.Projected.StatePlaneNad1983Feet.NAD1983StatePlaneMassachusettsMainlandFIPS2001Feet
                    fs.Reproject(prjProjected)

                    'create a new polygon from the reprojected coordinate array
                    Dim pg As New Polygon(fs.Features(0).Coordinates)

                    'get the area of the polygon
                    'mult area by scale
                    retArea = pg.Area * Math.Pow(prjProjected.Unit.Meters, 2)
                End Using
Nov 22, 2013 at 3:41 PM
I'm not sure if this is the most "correct" way of doing it, but I calculated the area of a shape in Lat/Long using the code below. First I may an array of X/Y coordinates in the shape, then multiplied each one by .017453293 (0.017453293 converts degrees to radians: 2pi/360). Then I looped through each of the point to find the area

'm-2 because the starting point must be the same as the ending point
For j = 0 To numpoints - 2
 Area = Area + ((X(j + 1)) - (X(j))) * ((Math.Sin(Y(j))) + (Math.Sin(Y(j + 1))))
Next

Then to chose which unit I wanted to display the area

'Example for Feet
AreaFt = Math.Abs(Area * 6378137 * 6378137 / 2) * 10.76391041671

This got me pretty close to the correct area, even though it is not absolutely exact.