/// <summary>
 /// Возвращаем GPS координаты точки
 /// </summary>
 /// <param name="point">Точка с координатами Яндекса</param>
 /// <returns>GPS координаты</returns>
 public static PointD ConvertToGpsPoint(PointD point)
 {
     PointD result = new PointD();
     double integerX = Math.Truncate(point.X);
     result.X = integerX + (point.X - integerX) * 0.6;
     double integerY = Math.Truncate(point.Y);
     result.Y = integerY + (point.Y - integerY) * 0.6;
     return result;
 }
 /// <summary>
 /// Возвращаем Яндекс координаты точки
 /// </summary>
 /// <param name="point">Точка с GPS координатами</param>
 /// <returns>Яндекс координаты</returns>
 public static PointD ConvertGpsToYandexPoint(PointD point)
 {
     var result = new PointD();
     double integerX = Math.Truncate(point.X);
     result.X = integerX + (point.X - integerX) / 0.6;
     double integerY = Math.Truncate(point.Y);
     result.Y = integerY + (point.Y - integerY) / 0.6;
     return result;
 }
 /// <summary>
 /// Получаем точки полигона из строки с координатами
 /// </summary>
 /// <param name="stringPoints">Строка с координатами</param>
 /// <returns>Возвращает массив точек</returns>
 public static PointD[] GetPointsFromString(string stringPoints)
 {
     string[] coordinates = stringPoints.Split(new[] {' '});
     var result = new PointD[coordinates.Length/2];
     int j = 0;
     for( int i = 0; i < coordinates.Length;  i = i+2 )
     {
         PointD point = new PointD();
         point.X = Double.Parse( coordinates[i], new CultureInfo( "en-GB" ) );
         point.Y = Double.Parse( coordinates[i + 1], new CultureInfo( "en-GB" ));
         result[j] = point;
         if( j >= result.Length )
             break;
         j++;
     }
     return result;
 }
        /// <summary>
        /// Алгоритмом поиска принадлежности точки полигону на двухмерной плоскости
        /// </summary>
        /// <param name="mainPoint">Точка проверки</param>
        /// <returns>Результат принадлежности к полигону</returns>
        public bool IsInPolygon( PointD mainPoint)
        {
            bool result = false;

            for( int i = 0, j = Points.Length - 1; i < Points.Length; j = i++ )
            {
                if( Points[i].Y < mainPoint.Y && Points[j].Y >= mainPoint.Y ||
                    Points[j].Y < mainPoint.Y && Points[i].Y >= mainPoint.Y )
                {
                    if( Points[i].X + ( mainPoint.Y - Points[i].Y ) /
                      ( Points[j].Y - Points[i].Y ) *
                      ( Points[j].X - Points[i].X ) < mainPoint.X )
                    {
                        result = !result;
                    }
                }
            }
            return result;
        }
 /// <summary>
 /// Возвращаем Id полигона, которому пренадлежит точка
 /// </summary>
 /// <param name="polygons">Полигоны, которых нужно искать точку</param>
 /// <param name="mainPoint">Точка для проверки</param>
 /// <returns>Возвращает Id полигона</returns>
 public static string GetIdPolygonOwnerPoint( PolygonMap[] polygons, PointD mainPoint )
 {
     return polygons.Where(x => x.IsInPolygon(mainPoint)).Select(polygonMap => polygonMap.Id).FirstOrDefault();
 }
 public PolygonMap( string id, PointD[] points)
 {
     _id = id;
     _points = points;
 }