/// <summary> /// 获取转换后的点 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="param4"></param> /// <returns></returns> private HorizontalCoordinate GetTransformedPoint(double x, double y, Matrix param4) { var offset = ((int)x / 1000000) * 1000000; // 坐标转换 x = x - offset; var sourceCoordinate = new HorizontalCoordinate(x, y); var targetCoordinate = LinearTransformation.Transform(sourceCoordinate, param4); return(new HorizontalCoordinate(targetCoordinate.X + offset, targetCoordinate.Y)); }
public void GetSketchPointInfo(int index, ref double[] adfX, ref double[] adfY, ref double[] adfZ, Matrix param4) { var marker = m_pointOverlay.Markers[index]; var projection = new GaussKrugerProjection(); projection.Ellipsoid = ReferenceEllipsoid.International1975; projection.LongitudeOfOrigin = Math.Round(marker.Position.Lng / 3) * 3; projection.Forward(marker.Position.Lat, marker.Position.Lng, out adfX[0], out adfY[0]); var sourceCoordinate = new HorizontalCoordinate(adfX[0], adfY[0]); var targetCoordinate = LinearTransformation.Transform(sourceCoordinate, param4); adfX[0] = targetCoordinate.X + projection.LongitudeOfOrigin / 3 * 1000000; adfY[0] = targetCoordinate.Y; }
SKPoint CalculateScreenPoint(HorizontalCoordinate horizontalCoordinate, int width, int height) { coordinateProjection.GetAngleOffsets(horizontalCoordinate, out double horzAngle, out double vertAngle); // Use NaN to indicate points clearly out of range of the screen float x = float.NaN; float y = float.NaN; if (horzAngle > -90 && horzAngle < 90 && vertAngle > -90 && vertAngle < 90) { x = (float)(width / 2.0 + pixelsPerDegree * horzAngle); y = (float)(height / 2.0 + pixelsPerDegree * vertAngle); } return(new SKPoint(x, y)); }
public void GetSketchPolygonInfo(int index, ref double[] adfX, ref double[] adfY, ref double[] adfZ, Matrix param4) { var polygon = m_polygonOverlay.Polygons[index]; var projection = new GaussKrugerProjection(); projection.Ellipsoid = ReferenceEllipsoid.International1975; for (int i = 0; i < polygon.Points.Count; i++) { projection.LongitudeOfOrigin = Math.Round(polygon.Points[i].Lng / 3) * 3; projection.Forward(polygon.Points[i].Lat, polygon.Points[i].Lng, out adfX[i], out adfY[i]); var sourceCoordinate = new HorizontalCoordinate(adfX[i], adfY[i]); var targetCoordinate = LinearTransformation.Transform(sourceCoordinate, param4); adfX[i] = targetCoordinate.X + projection.LongitudeOfOrigin / 3 * 1000000; adfY[i] = targetCoordinate.Y; } }
void ProcessNewOrientationReading(OrientationSensorReading orientationReading) { if (orientationReading == null) { return; } // Get the rotation matrix & convert to horizontal coordinates SensorRotationMatrix m = orientationReading.RotationMatrix; if (m == null) { return; } Matrix3D matrix3d = new Matrix3D(m.M11, m.M12, m.M13, 0, m.M21, m.M22, m.M23, 0, m.M31, m.M32, m.M33, 0, 0, 0, 0, 1); if (!matrix3d.HasInverse) { return; } HorizontalCoordinate horzCoord = HorizontalCoordinate.FromMotionMatrix(matrix3d); // Set the transform center on the Image element imageTransform.CenterX = (imageWidth + maxDimension) * (180 + horzCoord.Azimuth) / 360 - maxDimension / 2; imageTransform.CenterY = (imageHeight + maxDimension) * (90 - horzCoord.Altitude) / 180 - maxDimension / 2; // Set the translation on the Border element borderTransform.TranslateX = imageTransform.CenterX - pageWidth / 2; borderTransform.TranslateY = imageTransform.CenterY - pageHeight / 2; // Get rotation from Tilt rotation = -horzCoord.Tilt; UpdateImageTransforms(); }
/// <summary> /// 获取转换后的点 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="param4"></param> /// <returns></returns> private PointLatLng GetTransformedPoint(double x, double y, Matrix param4) { var projection = new GaussKrugerProjection(); projection.Ellipsoid = ReferenceEllipsoid.International1975; var zone = (int)x / 1000000; x = x - zone * 1000000; // 坐标转换(不要加大数) var sourceCoordinate = new HorizontalCoordinate(x, y); var targetCoordinate = LinearTransformation.Transform(sourceCoordinate, param4); // 再转成经纬度(加上大数,因为需要计算投影带号) double lat, lng; projection.LongitudeOfOrigin = zone * 3; projection.Reverse(targetCoordinate.X, targetCoordinate.Y, out lat, out lng); return(new PointLatLng(lat, lng)); }
void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args) { SKImageInfo info = args.Info; SKSurface surface = args.Surface; SKCanvas canvas = surface.Canvas; canvas.Clear(); // From orientation quaternion, get view center in horizontal coordinates Matrix4x4 matrix = Matrix4x4.CreateFromQuaternion(orientation); HorizontalCoordinate viewCenter = HorizontalCoordinate.FromRotationMatrix(matrix); coordinateProjection.SetViewCenter(viewCenter); // Rotate for Tilt canvas.RotateDegrees((float)-viewCenter.Tilt, info.Width / 2, info.Height / 2); // Draw aximuth lines for (double azimuth = 0; azimuth < 360; azimuth += 15) { for (double altitude = -90; altitude < 90; altitude += 15) { HorizontalCoordinate coord1 = new HorizontalCoordinate(azimuth, altitude); HorizontalCoordinate coord2 = new HorizontalCoordinate(azimuth, altitude + 15); SKPoint point1 = CalculateScreenPoint(coord1, info.Width, info.Height); SKPoint point2 = CalculateScreenPoint(coord2, info.Width, info.Height); if (!double.IsNaN(point1.X) && !double.IsNaN(point2.X)) { canvas.DrawLine(point1, point2, linePaint); } } } // Draw altitude lines for (double altitude = -75; altitude < 90; altitude += 15) { for (double azimuth = 0; azimuth < 360; azimuth += 15) { HorizontalCoordinate coord1 = new HorizontalCoordinate(azimuth, altitude); HorizontalCoordinate coord2 = new HorizontalCoordinate(azimuth + 15, altitude); SKPoint point1 = CalculateScreenPoint(coord1, info.Width, info.Height); SKPoint point2 = CalculateScreenPoint(coord2, info.Width, info.Height); if (!double.IsNaN(point1.X) && !double.IsNaN(point2.X)) { canvas.DrawLine(point1, point2, linePaint); } } } // Draw text for altitude angles for (double altitude = -75; altitude < 90; altitude += 15) { HorizontalCoordinate coord = new HorizontalCoordinate(viewCenter.Azimuth, altitude); SKPoint point = CalculateScreenPoint(coord, info.Width, info.Height); textPaint.TextAlign = SKTextAlign.Center; canvas.DrawText(altitude == 0 ? "Equator" : (altitude.ToString() + '\xB0'), point, textPaint); } // Draw text for azimuth compass points for (double azimuth = 0; azimuth < 360; azimuth += 45) { double altitude = Math.Min(80, Math.Max(-80, viewCenter.Altitude)); HorizontalCoordinate coord = new HorizontalCoordinate(azimuth, altitude); SKPoint point = CalculateScreenPoint(coord, info.Width, info.Height); textPaint.TextAlign = SKTextAlign.Left; canvas.DrawText(compass[(int)(azimuth / 45)], point, textPaint); } }