public static int GetUtmZone(UtmPosition position) { if (position.Zone == 0) // lat / long { return(GetUtmZone(position.Northing, position.Easting)); } else { return(GetUtmZone(position.TransformToWGS())); } }
private void DrawLatLongGrid(Graphics vGraphics, UtmPosition pOrigoUtm33, UtmPosition pBottomRightUtm33, float pZoom, SizeF vLabelRectSize) { var vOrigoWGS = pOrigoUtm33.TransformToWGS(); var vBottomRigthWGS = pBottomRightUtm33.TransformToWGS(); var vBottomLeftWGS = new UtmPosition(0, pOrigoUtm33.Easting, pBottomRightUtm33.Northing).TransformToWGS(); var vTopRightWGS = new UtmPosition(0, pBottomRightUtm33.Easting, pOrigoUtm33.Northing).TransformToWGS(); double vStartEasting = Math.Min(vOrigoWGS.Easting, vBottomLeftWGS.Easting); vStartEasting = Math.Floor(vStartEasting / 0.1) * 0.1; double vEndEasting = Math.Max(vTopRightWGS.Easting, vBottomRigthWGS.Easting); vEndEasting = Math.Ceiling(vEndEasting / 0.1) * 0.1; double vStartNorthing = Math.Min(vBottomLeftWGS.Northing, vBottomRigthWGS.Northing); vStartNorthing = Math.Floor(vStartNorthing / 0.1) * 0.1; double vEndNorthing = Math.Max(vOrigoWGS.Northing, vTopRightWGS.Northing); vEndNorthing = Math.Ceiling(vEndNorthing / 0.1) * 0.1; Pen vLinePen = new Pen(Color.FromArgb(150, Color.Red), (float)(Setup.PixelsPerMeter * Setup.ScaleAndTileSize.Scale / 3000.0)); Pen vSolidLinePen = new Pen(Color.FromArgb(200, Color.Red), (float)(Setup.PixelsPerMeter * Setup.ScaleAndTileSize.Scale / 2000.0)); for (double x = vStartEasting; x <= vEndEasting; x += 0.1) { var vStartWGS = new UtmPosition(0, x, vStartNorthing); var vMidWGS = new UtmPosition(0, x, vStartNorthing + (vEndNorthing - vStartNorthing) / 2.0); var vEndWGS = new UtmPosition(0, x, vEndNorthing); var vStartUtm33 = vStartWGS.TransformFromWGS(33); var vMidUtm33 = vMidWGS.TransformFromWGS(33); var vEndUtm33 = vEndWGS.TransformFromWGS(33); PointF vStart = Utm33ToBitmapPosition(vStartUtm33, pOrigoUtm33, pZoom); PointF vMid = Utm33ToBitmapPosition(vMidUtm33, pOrigoUtm33, pZoom); PointF vEnd = Utm33ToBitmapPosition(vEndUtm33, pOrigoUtm33, pZoom); if (Math.Round(x, 1) % 1.0 == 0.0) { vGraphics.DrawCurve(vSolidLinePen, new PointF[] { vStart, vMid, vEnd }); } else { vGraphics.DrawCurve(vLinePen, new PointF[] { vStart, vMid, vEnd }); } float vIncline = (vEnd.X - vStart.X) / (vEnd.Y - vStart.Y); PointF vLabelPosition = new PointF(vStart.X - vIncline * vStart.Y, 0); RectangleF vLabelRect = new RectangleF(vLabelPosition.X - vLabelRectSize.Width / 2F, vLabelPosition.Y, vLabelRectSize.Width, vLabelRectSize.Height); DrawLabelWGS(vGraphics, vLabelRect, vStartWGS.Easting); vLabelPosition = new PointF(vStart.X - vIncline * (vStart.Y - vGraphics.VisibleClipBounds.Height), vGraphics.VisibleClipBounds.Height - vLabelRectSize.Height); vLabelRect = new RectangleF(vLabelPosition.X - vLabelRectSize.Width / 2F, vLabelPosition.Y, vLabelRectSize.Width, vLabelRectSize.Height); DrawLabelWGS(vGraphics, vLabelRect, vStartWGS.Easting); } for (double y = vStartNorthing; y <= vEndNorthing; y += 0.1) { var vStartWGS = new UtmPosition(0, vStartEasting, y); var vMidWGS = new UtmPosition(0, vStartEasting + (vEndEasting - vStartEasting) / 2.0, y); var vEndWGS = new UtmPosition(0, vEndEasting, y); var vStartUtm33 = vStartWGS.TransformFromWGS(33); var vMidUtm33 = vMidWGS.TransformFromWGS(33); var vEndUtm33 = vEndWGS.TransformFromWGS(33); PointF vStart = Utm33ToBitmapPosition(vStartUtm33, pOrigoUtm33, pZoom); PointF vMid = Utm33ToBitmapPosition(vMidUtm33, pOrigoUtm33, pZoom); PointF vEnd = Utm33ToBitmapPosition(vEndUtm33, pOrigoUtm33, pZoom); if (Math.Round(y, 1) % 1.0 == 0.0) { vGraphics.DrawCurve(vSolidLinePen, new PointF[] { vStart, vMid, vEnd }); } else { vGraphics.DrawCurve(vLinePen, new PointF[] { vStart, vMid, vEnd }); } float vIncline = (vEnd.Y - vStart.Y) / (vEnd.X - vStart.X); PointF vLabelPosition = new PointF(0, vStart.Y - vIncline * vStart.X); RectangleF vLabelRect = new RectangleF(vLabelPosition.X, vLabelPosition.Y - vLabelRectSize.Height / 2F, vLabelRectSize.Width, vLabelRectSize.Height); DrawLabelWGS(vGraphics, vLabelRect, vStartWGS.Northing); vLabelPosition = new PointF(vGraphics.VisibleClipBounds.Width - vLabelRectSize.Width, vStart.Y - vIncline * (vStart.X - vGraphics.VisibleClipBounds.Width)); vLabelRect = new RectangleF(vLabelPosition.X, vLabelPosition.Y - vLabelRectSize.Height / 2F, vLabelRectSize.Width, vLabelRectSize.Height); DrawLabelWGS(vGraphics, vLabelRect, vStartWGS.Northing); } }