谷歌地图Android和iOS Xamarin:在随机点击的坐标上创建关闭多边形

时间:2017-07-21 00:37:39

标签: android ios google-maps

我在Xamarin Android和iOS上使用谷歌地图

我试图从随机抽头坐标创建一个近似多边形。

Android喜欢:

var options = new PolygonOptions();
                        options.InvokeFillColor(int.Parse("80000000", System.Globalization.NumberStyles.HexNumber));
                        options.InvokeStrokeColor(int.Parse("000000", System.Globalization.NumberStyles.HexNumber));
                        options.InvokeStrokeWidth(2);
options.AddAll(listOfPosition); //list of tapped coordinates
googleMap.AddPolygon(options);

iOS喜欢:

var polygon = new Polygon();
                    polygon.Path = path; // this is my list of tapped coordinates
                    polygon.StrokeWidth = 2;
                    polygon.StrokeColor = UIColor.Black;
                    polygon.FillColor = UIColor.FromRGBA(0, 0, 0, 0.3f);
polygon.Map = mapView;

假设我已经随机点击坐标:

Debug|LOCATION:: 37.9115841998119 : -122.566957734525
Debug|LOCATION:: 37.9117754470967 : -122.561504803598
Debug|LOCATION:: 37.9085008969633 : -122.566276118159
Debug|LOCATION:: 37.9086561762004 : -122.562640719116
Debug|LOCATION:: 37.9102216477146 : -122.561550065875
Debug|LOCATION:: 37.9098513127501 : -122.567805983126
Debug|LOCATION:: 37.9123967989511 : -122.564518935978

如何将其关闭多边形而不相交内线甚至可以将坐标达到100位置数据。任何想法或计算?谢谢提前..

enter image description here

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

这是解决方案:)

你需要在Lat和Lon上获得最多的左派和最右派。

获取最小和最大纬度。

enter image description here

画一条线并先分开较低点和较高点

检查点是否高于或低于行的等式。

public static bool CheckIsUpperCoordinate(PositionData a, PositionData b, PositionData c)
        {
            var position = Math.Sign((b.Latitude - a.Latitude) * (c.Longitude - a.Longitude) - (b.Longitude - a.Longitude) * (c.Latitude - a.Latitude));

            return position > 0 ? true : false; //true if upper , false if lower position
        }

现在按经度排序lowerlist和upperlist。

var lowerPosition = lowerPositionList.OrderBy(x => x.Longitude).ToList();
var higherPosition = higherPositionList.OrderByDescending(x => x.Longitude).ToList(); 

并且最左边连接此序列中的所有点 - >低点列表 - >最右边 - >上部点列表

path.AddLatLon(leftMost.Latitude, leftMost.Longitude);

foreach (PositionData lowerData in lowerPosition)
{
       path.AddLatLon(lowerData.Latitude, lowerData.Longitude);
}
path.AddLatLon(rightMost.Latitude, rightMost.Longitude);

foreach (PositionData higherData in higherPosition)
{
       path.AddLatLon(higherData.Latitude, higherData.Longitude);

}
path.AddLatLon(leftMost.Latitude, leftMost.Longitude);

将其包裹在多边形

var polygon = new Polygon();
                    polygon.Path = path;
                    polygon.StrokeWidth = 2;
                    polygon.StrokeColor = UIColor.Black;
                    polygon.FillColor = UIColor.FromRGBA(0, 0, 0, 0.3f);
  polygon.Map = mapView;

希望它可以帮助某人:)

在完成这项任务后,我很欣赏我的数学老师。大声笑xd