/// <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; }