/// <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;
            }
        }
Example #5
0
        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);
            }
        }