private void drawMapFeature(Graphics g, Rectangle Rect, DRect rectScreenInLayer, CoordConverter oCC, Feature feature, bool selectionStyle) { Debug.Assert(feature != null); if (feature is PolylineFeature) { PolylineFeature oP = (PolylineFeature)feature; // draw polyline points for (int iPart = 0; iPart < oP.m_oParts.Count; iPart++) { List<DPoint> Points_list = oP.m_oParts[iPart].Points; if (Points_list.Count > 0) { DPoint[] Points_src = oP.m_oParts[iPart].Points.ToArray(); int ipp_count = Points_src.GetLength(0); Point[] Points_array = new Point[ipp_count]; Rectangle rect = new Rectangle(0, 0, 6, 6); int? currPointX = null; int? currPointY = null; int? prevPointX = null; int? prevPointY = null; for (int ipp = 0; ipp < ipp_count; ipp++) { // only points withing screen area if (rectScreenInLayer.Contains((double)Points_src[ipp].X, (double)Points_src[ipp].Y)) { oCC.Convert(Points_src[ipp].X, Points_src[ipp].Y); currPointX = (int)oCC.X; currPointY = (int)oCC.Y; rect.X = (int)oCC.X - 3; rect.Y = (int)oCC.Y - 3; rect.Width = 6; rect.Height = 6; if (Points_src[ipp].Selected) { m_oRenderGDIplus.FillRectangle(g, rect, 0xffff0000); // red } else { m_oRenderGDIplus.DrawRectangle(g, rect, 0xff0000ff); // blue } } else { currPointX = null; currPointY = null; } // "add point marker" if (ipp > 0) { if (currPointX != null || prevPointX != null) { // draw if at least one point is visible if (prevPointX == null) { // failed to calculate earlier (not visible), do it now oCC.Convert(Points_src[ipp - 1].X, Points_src[ipp - 1].Y); prevPointX = (int)oCC.X; prevPointY = (int)oCC.Y; } if (currPointX == null) { // failed to calculate earlier (not visible), do it now oCC.Convert(Points_src[ipp].X, Points_src[ipp].Y); currPointX = (int)oCC.X; currPointY = (int)oCC.Y; } int dx = (int)(currPointX - prevPointX); int dy = (int)(currPointY - prevPointY); int len = (int)Math.Sqrt(dx * dx + dy * dy); // draw when line segment longer than 20 pixels if (len > 20) { int pointX = (int)(prevPointX + currPointX) / 2; int pointY = (int)(prevPointY + currPointY) / 2; //m_oRenderGDIplus.DrawLine(g, pointX - 3, pointY - 3, pointX + 3, pointY + 3, 2, Color.Blue, 1); //m_oRenderGDIplus.DrawLine(g, pointX - 3, pointY + 3, pointX + 3, pointY - 3, 2, Color.Blue, 1); } } } prevPointX = currPointX; prevPointY = currPointY; } } } // draw actual polyline for (int iPart = 0; iPart < oP.m_oParts.Count; iPart++) { List<DPoint> Points_list = oP.m_oParts[iPart].Points; if (Points_list.Count > 0) { DPoint[] Points_src = oP.m_oParts[iPart].Points.ToArray(); int ipp_count = Points_src.GetLength(0); Point[] Points_array = new Point[ipp_count]; for (int ipp = 0; ipp < ipp_count; ipp++) { oCC.Convert((double)Points_src[ipp].X, (double)Points_src[ipp].Y); Points_array[ipp] = new Point((int)oCC.X, (int)oCC.Y); } if (oP.Selected) { m_oRenderGDIplus.DrawPolylineFeature(g, Points_array, oP.Style.LinePattern, Color.Red, oP.Style.LineWidth); } else { m_oRenderGDIplus.DrawPolylineFeature(g, Points_array, oP.Style.LinePattern, oP.Style.LineColor, oP.Style.LineWidth); } } } } else if (feature is SymbolFeature) { SymbolFeature oP = (SymbolFeature)feature; oCC.Convert(oP.x, oP.y); Rectangle rect = new Rectangle((int)oCC.X - 2, (int)oCC.Y - 2, 4, 4); if ((oP.color & 0xff000000) != 0x00) { if (feature.Selected) { m_oRenderGDIplus.DrawRectangle(g, rect, (uint)Color.Red.ToArgb()); } else { m_oRenderGDIplus.DrawRectangle(g, rect, oP.color); } } } else if (feature is RectangleFeature) { RectangleFeature oP = (RectangleFeature)feature; oCC.Convert(oP.x, oP.y); Rectangle rect = new Rectangle((int)oCC.X - 2, (int)oCC.Y - 2, 4, 4); m_oRenderGDIplus.DrawRectangle(g, rect, (uint)0xff000000); } else if (feature is BitmapFeature) { BitmapFeature oB = feature as BitmapFeature; oCC.Convert(oB.X, oB.Y); int x = (int)oCC.X; int y = (int)oCC.Y; g.DrawImageUnscaled(oB.Bitmap, new Point(x - oB.Anchorx, y - oB.Anchory)); } else { throw new NotImplementedException(); } }
private void DrawEllipse(int x1, int y1, int w, int h, Graphics g, CoordConverter oCC1) { // bitmap position oCC1.Convert(x1, y1); int xScr = (int)oCC1.X; int yScr = (int)oCC1.Y; oCC1.Convert(x1 + w, y1 + h); int xScrWidth = (int)(oCC1.X - xScr); int yScrWidth = (int)(oCC1.Y - yScr); g.DrawEllipse(Pens.Red, xScr, yScr, xScrWidth, yScrWidth); string s = string.Format("x={0}, y={1}", x1, y1); g.DrawString(s, new Font("Arial", 16), Brushes.Green, xScr + 64, yScr + 128, StringFormat.GenericDefault); }
private void DrawImageGMap(int x1, int y1, int w, int h, Graphics g, CoordConverter oCC, int picx, int picy, int picZoom) { PureImage img = null; try { Exception result; img = GMaps.Instance.GetImageFrom(mapType, new GMap.NET.Point(picx, picy), picZoom, out result); } catch (Exception) { } WindowsFormsImage imgWin = (WindowsFormsImage)img; if (imgWin == null) return; // bitmap position oCC.Convert(x1, y1); int xScr = (int)Math.Round(oCC.X); int yScr = (int)Math.Round(oCC.Y); oCC.Convert(x1 + w, y1 + h); int xScrWidth = (int)Math.Round(oCC.X - xScr); int yScrWidth = (int)Math.Round(oCC.Y - yScr); if (xScrWidth < 0) { xScrWidth = -xScrWidth; xScr = xScr - xScrWidth; } if (yScrWidth < 0) { yScrWidth = -yScrWidth; yScr = yScr - yScrWidth; } if (img != null) { Debug.Assert(xScrWidth == 256); Debug.Assert(yScrWidth == 256); g.DrawImage(imgWin.Img, xScr, yScr, xScrWidth, yScrWidth); } else { Assembly myAssembly = Assembly.GetExecutingAssembly(); Stream myStream = myAssembly.GetManifestResourceStream("hiMapNet.Resources.h0.jpeg"); Bitmap bmp = new Bitmap(myStream); g.DrawImage(bmp, xScr, yScr, xScrWidth, yScrWidth); bmp.Dispose(); } }
/// <summary> /// Select all objects within the rectangle /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public override void MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { bool modified = false; base.MouseUp(sender, e); bool keyShift = ((System.Windows.Forms.Control.ModifierKeys & Keys.Shift) == Keys.Shift); bool keyControl = ((System.Windows.Forms.Control.ModifierKeys & Keys.Control) == Keys.Control); MapControl.Globals.Instance.MapControl.Cursor = Cursors.Arrow; if (ActiveRectangle.Width == 0 && ActiveRectangle.Height == 0) { relocateMode = false; rotateMode = false; rectSelectionMode = false; relocateModeAllowRelocation = false; DRect rect = calculateRectangleFromPoint(e.X, e.Y); List<DPoint> points = polylineLayer.SearchForPolylinePoints(rect); if (points.Count > 0) { if (points[0].Selected) { if (!keyControl && !keyShift) { polylineLayer.selectionClear(); points[0].Selected = true; MapControl.Globals.Instance.MapControl.InvalidateMap(); modified = true; } if (keyControl && !keyShift) { points[0].Selected = false; MapControl.Globals.Instance.MapControl.InvalidateMap(); modified = true; } } else { if (keyControl && !keyShift) { points[0].Selected = true; MapControl.Globals.Instance.MapControl.InvalidateMap(); modified = true; } } if (modified) { if (ToolUsed != null) ToolUsed(this, new EventArgs()); } return; } // select polyline // try to select an object List<Feature> features = polylineLayer.SearchForFeaturesColliding(rect); if (features.Count > 0) { if (features[0].Selected) { if (!keyControl && !keyShift) { polylineLayer.selectionClear(); features[0].Selected = true; modified = true; MapControl.Globals.Instance.MapControl.InvalidateMap(); } if (keyControl && !keyShift) { features[0].Selected = false; modified = true; MapControl.Globals.Instance.MapControl.InvalidateMap(); } } else { if (keyControl && !keyShift) { features[0].Selected = true; modified = true; MapControl.Globals.Instance.MapControl.InvalidateMap(); } } if (modified) { if (ToolUsed != null) ToolUsed(this, new EventArgs()); } return; } if (!keyControl && !keyShift) { polylineLayer.selectionClear(); modified = true; } } else { // Dragging done if (relocateMode && relocateModeAllowRelocation) { List<Feature> features = polylineLayer.selectionFeatures(); List<DPoint> points = polylineLayer.selectionPoints(true); // calculate delta... // mouse start: m_oMouseStart // mouse end: m_oMouseCurrent int dxi = m_oMouseStart.X - m_oMouseCurrent.X; int dyi = m_oMouseStart.Y - m_oMouseCurrent.Y; int pixelDelta = (int)Math.Sqrt(dxi * dxi + dyi * dyi); DRect r1 = calculateRectangleFromPoint(m_oMouseStart.X, m_oMouseStart.Y); DRect r2 = calculateRectangleFromPoint(m_oMouseCurrent.X, m_oMouseCurrent.Y); double dx = r2.X1 - r1.X1; double dy = r2.Y1 - r1.Y1; // store copy of original point for undo polylineLayer.Manager.startRecordingUndoElement(); symbolLayer.Manager.startRecordingUndoElement(); // move polylines for (int i = 0; i < points.Count; i++) { DPoint newPoint = new DPoint(points[i].X + dx, points[i].Y + dy); polylineLayer.Manager.recordMovePoint(points[i], newPoint); // find correcponding symbol in symbolLayer SymbolFeature symbol = (SymbolFeature)points[i].Tag; Debug.Assert(symbol != null); SymbolFeature newSymbol = new SymbolFeature(symbol.x + dx, symbol.y + dy); symbolLayer.Manager.recordMoveFeature(symbol, newSymbol); modified = true; } polylineLayer.Manager.stopRecordingUndoElement(); symbolLayer.Manager.stopRecordingUndoElement(); // refresh view MapControl.Globals.Instance.MapControl.InvalidateMap(); } if (rotateMode) { // rotation } if (rectSelectionMode) { if (!keyShift && !keyControl) { polylineLayer.selectionClear(); modified = true; /* // emit clear selection for all wpt-s for (int i = 0; i < symbolLayer.FeaturesCount; i++) { SymbolFeature symbol = symbolLayer.FeatureGet(i) as SymbolFeature; if (symbol != null) { //WptSelected(this, (symbol.Tag as GpxWpt), false); } }*/ } if (!keyControl) { System.Drawing.Rectangle r = ActiveRectangle; System.Drawing.Point p1 = new System.Drawing.Point(r.X, r.Y); System.Drawing.Point p2 = new System.Drawing.Point(r.X + r.Width, r.Y + r.Height); DPoint pt1, pt2; map.DisplayTransform.FromDisplay(p1, out pt1); map.DisplayTransform.FromDisplay(p2, out pt2); // convert mercator to wgs84 CoordConverter occ = new CoordConverter(); CoordSys oCSMercator = CoordSysFactory.CreateCoordSys(CoordSysType.Mercator, CoordSysFactory.CreateDatum(DatumID.WGS84), new AffineTransform()); CoordSys oCSWGS84 = CoordSysFactory.CreateCoordSys(CoordSysType.LatLong, CoordSysFactory.CreateDatum(DatumID.WGS84), new AffineTransform()); occ.Init(oCSMercator, oCSWGS84); occ.Convert(pt1.X, pt1.Y); DPoint dp1 = new DPoint(occ.X, occ.Y); occ.Convert(pt2.X, pt2.Y); DPoint dp2 = new DPoint(occ.X, occ.Y); DRect rect = new DRect(dp1.X, dp2.Y, dp2.X, dp1.Y); List<DPoint> points = polylineLayer.SearchForPolylinePoints(rect); for (int i = 0; i < points.Count; i++) { points[i].Selected = true; modified = true; } List<Feature> features = polylineLayer.SearchForFeaturesContained(rect); for (int i = 0; i < features.Count; i++) { features[i].Selected = true; modified = true; } MapControl.Globals.Instance.MapControl.InvalidateMap(); } } if (timer != null) { timer.Stop(); timer = null; } relocateMode = false; rotateMode = false; rectSelectionMode = false; relocateModeAllowRelocation = false; } if (modified) { if (ToolUsed != null) ToolUsed(this, new EventArgs()); } }
private DRect calculateRectangleFromPoint(int x, int y) { // try to select a polyline point int margin = 3; System.Drawing.Point p1 = new System.Drawing.Point(x - margin, y - margin); System.Drawing.Point p2 = new System.Drawing.Point(x + margin, y + margin); DPoint pt1, pt2; map.DisplayTransform.FromDisplay(p1, out pt1); map.DisplayTransform.FromDisplay(p2, out pt2); // convert mercator to wgs84 CoordConverter occ = new CoordConverter(); CoordSys oCSMercator = CoordSysFactory.CreateCoordSys(CoordSysType.Mercator, CoordSysFactory.CreateDatum(DatumID.WGS84), new AffineTransform()); CoordSys oCSWGS84 = CoordSysFactory.CreateCoordSys(CoordSysType.LatLong, CoordSysFactory.CreateDatum(DatumID.WGS84), new AffineTransform()); occ.Init(oCSMercator, oCSWGS84); occ.Convert(pt1.X, pt1.Y); DPoint dp1 = new DPoint(occ.X, occ.Y); occ.Convert(pt2.X, pt2.Y); DPoint dp2 = new DPoint(occ.X, occ.Y); DRect rect = new DRect(dp1.X, dp2.Y, dp2.X, dp1.Y); return rect; }
private void drawOneLayerTile(int x1, int y1, int w, int h, Graphics g, CoordConverter oCC, int picx, int picy, int picZoom, bool tryDownloading) { Image imageToScreen = null; // get image from cache or schedule its download imageToScreen = TileImageLoaderAndCache.Instance.getImage(picx, picy, picZoom, mapType, tryDownloading); // bitmap position oCC.Convert(x1, y1); int xScr = (int)Math.Round(oCC.X); int yScr = (int)Math.Round(oCC.Y); oCC.Convert(x1 + w, y1 + h); int xScrWidth = (int)Math.Round(oCC.X - xScr); int yScrWidth = (int)Math.Round(oCC.Y - yScr); if (xScrWidth < 0) { xScrWidth = -xScrWidth; xScr = xScr - xScrWidth; } if (yScrWidth < 0) { yScrWidth = -yScrWidth; yScr = yScr - yScrWidth; } if (imageToScreen != null) { Debug.Assert(xScrWidth == 256); Debug.Assert(yScrWidth == 256); g.DrawImage(imageToScreen, xScr, yScr, xScrWidth, yScrWidth); } else { Assembly myAssembly = Assembly.GetExecutingAssembly(); Stream myStream = myAssembly.GetManifestResourceStream("hiMapNet.Resources.h0.jpeg"); if (myStream != null) { Bitmap bmp = new Bitmap(myStream); g.DrawImage(bmp, xScr, yScr, xScrWidth, yScrWidth); bmp.Dispose(); } } }
private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { // test coordsys Datum datumEllipse = CoordSysFactory.CreateDatum(DatumID.WGS84); Datum datumSphere = CoordSysFactory.CreateDatum(Ellipsoid.Sphere, 0, 0, 0, 0, 0, 0, 0, 0); CoordSys source = CoordSysFactory.CreateCoordSys(CoordSysType.LatLong, datumEllipse, new AffineTransform()); CoordSys target = CoordSysFactory.CreateCoordSys(CoordSysType.Mercator, datumEllipse, new AffineTransform()); CoordConverter oCC = new CoordConverter(); oCC.Init(source, target); oCC.Convert(21, 52); double x = oCC.X; // 2337709.3066587453 double y = oCC.Y; // 6800125.4543973068 // (21, 52) -> (2337709.3066587453, 6800125.4543973068) (alg. Sphere) // (21, 52) -> (2337709.3066587453, 6766432.7231710562) (alg. Ellipse) // (21, 52) -> (2337709.3066587453, 6800078.8362877583) (DatumConv + Ellipse) // (21, 52) -> (2337709.3066587453, 6800125.4543973068) (alg. Ellipse , data Sphere) }
private void mapControl1_MouseMove(object sender, MouseEventArgs e) { DPoint pt; mapControl1.Map.DisplayTransform.FromDisplay(new System.Drawing.Point(e.X, e.Y), out pt); // convert mercator to wgs84 CoordConverter occ = new CoordConverter(); CoordSys oCSMercator = CoordSysFactory.CreateCoordSys(CoordSysType.Mercator, CoordSysFactory.CreateDatum(DatumID.WGS84), new AffineTransform()); CoordSys oCSWGS84 = CoordSysFactory.CreateCoordSys(CoordSysType.LatLong, CoordSysFactory.CreateDatum(DatumID.WGS84), new AffineTransform()); occ.Init(oCSMercator, oCSWGS84); occ.Convert(pt.X, pt.Y); // calculate zoom CoordSys layerCoordsys = tileLayer.LayerCoordSys; CoordConverter oCC = new CoordConverter(); oCC.Init(layerCoordsys, mapControl1.Map.DisplayCoordSys); // this atPan converts DisplayCoordSys into Screen CoordSys[px] // DisplayCoordSys has Y axis up (unless its AT does not change it) // Screen Y axis is down AffineTransform atPan = new AffineTransform(); atPan.OffsetInPlace((double)mapControl1.Map.MapOffsetX, (double)mapControl1.Map.MapOffsetY); atPan.MultiplyInPlace(mapControl1.Map.MapScale, -mapControl1.Map.MapScale); // add screen scale and offset transformation oCC.atMaster = oCC.atMaster.Compose(atPan); double zoomElevateUpscale = 1024 * 8; //1024; double scale = oCC.atMaster.A; int zoom = (int)Math.Log(scale * zoomElevateUpscale, 2); lblInfo.Text = string.Format("x={0:0.00000}, y={1:0.00000} Mercator: x={2:0}, y={3:0}, zoom={4}", occ.X, occ.Y, pt.X, pt.Y, zoom); }
private void mapControl1_MouseClick(object sender, MouseEventArgs e) { if (mapControl1.CurrentTool == MapControl.ToolConst.InfoTool) { // get gpx coordinate (from map or from gpx table) DPoint pt; mapControl1.Map.DisplayTransform.FromDisplay(new System.Drawing.Point(e.X, e.Y), out pt); // convert mercator to wgs84 CoordConverter occ = new CoordConverter(); CoordSys oCSMercator = CoordSysFactory.CreateCoordSys(CoordSysType.Mercator, CoordSysFactory.CreateDatum(DatumID.WGS84), new AffineTransform()); CoordSys oCSWGS84 = CoordSysFactory.CreateCoordSys(CoordSysType.LatLong, CoordSysFactory.CreateDatum(DatumID.WGS84), new AffineTransform()); occ.Init(oCSMercator, oCSWGS84); occ.Convert(pt.X, pt.Y); lblInfo.Text = string.Format("x={0:0.00000}, y={1:0.00000} Mercator: x={2:0}, y={3:0}", occ.X, occ.Y, pt.X, pt.Y); // search for features //Feature[] fts = oLayerPointer.Search(pt); //e.X } }
private void InitMapAndPresenter() { // set Display coordsys mapControl1.Map.DisplayCoordSys = CoordSysFactory.CreateCoordSys("Mercator Datum(WGS84)"); // make Map Layer mapControl1.Map.Layers.Clear(); mapControl1.ResizeScaleMode = MapControl.ResizeScaleConst.NoChange; // One Tile Layer tileLayer = new LayerTilesAsynch(); // mercator (datum(wgs84)) mapControl1.Map.Layers.Add(tileLayer); // MVC ------------ // bind view to presentation surface (control) gpxMapView = new GPXViewMap(mapControl1); gpxViewTree = new GPXViewTree(treeView1); gpxViewScrollbar = new GPXViewScrollbar(gpxScrollBar); gpxViewTimeSlide = new GPXViewTimeSlide(timeSlide1); gpxPresenter = new GPXPresenter(); gpxPresenter.registerView(gpxMapView); gpxPresenter.registerView(gpxViewTree); gpxPresenter.registerView(gpxViewScrollbar); gpxPresenter.registerView(gpxViewTimeSlide); mapControl1.Map.InsertionLayer = gpxMapView.o_LayerGPXPolylines; // CoordSys oCSWGS84 = CoordSysFactory.CreateCoordSys(CoordSysType.LatLong, CoordSysFactory.CreateDatum(DatumID.WGS84), new AffineTransform()); oCCGPS = new CoordConverter(); oCCGPS.Init(gpxMapView.o_LayerGPXPolylines.LayerCoordSys, mapControl1.Map.DisplayCoordSys); // show zoom=0 (whole world) in scale 1px screen = 1px layer Datum datumWGS84 = CoordSysFactory.CreateDatum(DatumID.WGS84); double r = datumWGS84.SemiMajorAxis; double zoom = mapControl1.Bounds.Width / 256.0 * 2 * Math.PI * r; //mapControl1.SetCenterZoom(0.0, 0.0, zoom, mapControl1.Bounds); /* if (gpxFile.getWptCount() > 0) { GpxWpt wpt = gpxFile.getWpt(0); oCCGPS.Convert(wpt.lon, wpt.lat); mapControl1.SetCenterZoom(oCCGPS.X, -oCCGPS.Y, zoom / 256.0, mapControl1.Bounds); // center poland } else {*/ oCCGPS.Convert(21.0, 52.0); mapControl1.SetCenterZoom(oCCGPS.X, -oCCGPS.Y, zoom / 256.0, mapControl1.Bounds); // center poland //} }