ThinkGeo.com    |     Documentation    |     Premium Support

Outer Polygon at specific distance from inner polygon

Hi all


I want to create an outer polygon whose boundary should be at specified distance from the already created inner polygon.


What I have attempted :-


1. I created a polygonshape of Vertexs


2. Then i used buffer method of polygonshape as it is explained in "How Do Samples"


3. In this way i have been able to create an outer polygon at some distance but


4. but the distance between outer and inner polygon is not accurate that I passes as an argument to the buffer method


5. Thats mean If i mention 2000m the distance between two lines of polygon will be achieved about 1600m to 1700m.


6. I am using the google map layer for satellites map.


Kindly guide me from the scratch.


Thanks


Atif.



Hi Atif,



This issue is caused by the Mercator projection which the google layer coordinates system is based on. In that projection, when we call GetLength or Buffer method, the distance is not equal with the real world length. That makes the differences as you can see. 



So, we need to project the polygon from Mercator to Geodetic(lon/lat) and then do the buffer. After the buffer, then project the polygon back from Geodetic to Mercator. Please try the below codes:


PolygonShape projectedPolygon =  proj4.ConvertToExternalProjection(polygonShape) as PolygonShape;
MultipolygonShape bufferedPolygonIn4326 = projectedPolygon.Buffer(2000, GeographyUnit.DecimalDegree, DistanceUnit.Meter);
MultipolygonShape bufferedPolygonInGoogle = proj4.ConvertToInternalProjection(bufferedPolygonIn4326) as MultipolygonShape;

Please let us know if any questions.



Thanks,



Troy

Hi Troy



Thanks for your guidance,

I am already using this internal and external conversion but the problem is still there. 



Waiting for more support. 



Best Regards

Atif.

 

Hi Atif,



I think I may misunderstand your case. If you want to display a 2km distance buffer on a Mercator map like google/bing, then we should do the buffer on the Mercator projection coordinates system. For example, 




PointShape googlePoint = new PointShape(-10875255.0413534, 3540886.18527768);
            MultipolygonShape projectedcircle = googlePoint.Buffer(2000, GeographyUnit.Meter, DistanceUnit.Meter);
 
            string newShapeFile = @"D:\test\circle1.shp";
            ShapeFileFeatureLayer.CreateShapeFile(ShapeFileType.Polygon, newShapeFile, new DbfColumn[] { new DbfColumn("Name", DbfColumnType.Character, 5, 0) }, System.Text.Encoding.Default,OverwriteMode.Overwrite);
            ShapeFileFeatureSource featureSource = new ShapeFileFeatureSource(newShapeFile, ShapeFileReadWriteMode.ReadWrite);
            featureSource.Open();
            featureSource.BeginTransaction();
            featureSource.AddFeature(new Feature(projectedcircle));
            featureSource.CommitTransaction();

In the above codes, the circle diameter length would be 4km. So, we need to make sure the shapes coordinates is based on Mercator and display at a Mercator project map.



Please let us know if any questions.

Thanks,

Troy