public static ICoordinate ImageToWorld(Map map, double width, double height) { ICoordinate c1 = map.ImageToWorld(new PointF(0, 0)); ICoordinate c2 = map.ImageToWorld(new PointF((float)width, (float)height)); return(GeometryFactory.CreateCoordinate(Math.Abs(c1.X - c2.X), Math.Abs(c1.Y - c2.Y))); }
public void ZoomToBox_NoAspectCorrection() { var map = new Map(new Size(400, 200)); map.ZoomToFit(GeometryFactory.CreateEnvelope(20, 50, 100, 80)); Assert.AreEqual(GeometryFactory.CreateCoordinate(35, 90), map.Center); Assert.AreEqual(40d, map.Zoom); }
public void ZoomToBox_WithAspectCorrection() { var map = new Map(new Size(400, 200)); map.ZoomToFit(GeometryFactory.CreateEnvelope(10, 20, 100, 180)); Assert.AreEqual(GeometryFactory.CreateCoordinate(15, 140), map.Center); Assert.AreEqual(160d, map.Zoom); }
public void WorldToMap_DefaultMap_ReturnValue() { Map map = new Map(new System.Drawing.Size(500, 200)); map.Center = GeometryFactory.CreateCoordinate(23, 34); map.Zoom = 1000; System.Drawing.PointF p = map.WorldToImage(GeometryFactory.CreateCoordinate(8, 50)); Assert.AreEqual(new System.Drawing.PointF(242.5f, 92), p); }
public void ImageToWorld_DefaultMap_ReturnValue() { var map = new Map(new Size(500, 200)) { Center = GeometryFactory.CreateCoordinate(23, 34), Zoom = 1000 }; ICoordinate p = map.ImageToWorld(new PointF(242.5f, 92)); Assert.AreEqual(GeometryFactory.CreateCoordinate(8, 50), p); }
public void WorldToImage() { Map map = new Map(new Size(1000, 500)); map.Zoom = 360; map.Center = GeometryFactory.CreateCoordinate(0, 0); Assert.AreEqual(new PointF(500, 250), map.WorldToImage(GeometryFactory.CreateCoordinate(0, 0))); Assert.AreEqual(new PointF(0, 0), map.WorldToImage(GeometryFactory.CreateCoordinate(-180, 90))); Assert.AreEqual(new PointF(0, 500), map.WorldToImage(GeometryFactory.CreateCoordinate(-180, -90))); Assert.AreEqual(new PointF(1000, 0), map.WorldToImage(GeometryFactory.CreateCoordinate(180, 90))); Assert.AreEqual(new PointF(1000, 500), map.WorldToImage(GeometryFactory.CreateCoordinate(180, -90))); }
public override void OnDraw(Graphics graphics) { if (MultiSelectionMode == MultiSelectionMode.Lasso) { GraphicsHelper.DrawSelectionLasso(graphics, KeyExtendSelection ? Color.Magenta : Color.DeepSkyBlue, selectPoints.ToArray()); } else { ICoordinate coordinate1 = GeometryFactory.CreateCoordinate(mouseDownLocation.X, mouseDownLocation.Y); ICoordinate coordinate2 = GeometryFactory.CreateCoordinate(WORLDPOSITION.X, WORLDPOSITION.Y); PointF point1 = Map.WorldToImage(coordinate1); PointF point2 = Map.WorldToImage(coordinate2); GraphicsHelper.DrawSelectionRectangle(graphics, KeyExtendSelection ? Color.Magenta : Color.DeepSkyBlue, point1, point2); } }
private IPolygon CreatePolygon(double left, double top, double right, double bottom) { var vertices = new List <ICoordinate> { GeometryFactory.CreateCoordinate(left, bottom), GeometryFactory.CreateCoordinate(right, bottom), GeometryFactory.CreateCoordinate(right, top), GeometryFactory.CreateCoordinate(left, top) }; vertices.Add((ICoordinate)vertices[0].Clone()); ILinearRing newLinearRing = GeometryFactory.CreateLinearRing(vertices.ToArray()); return(GeometryFactory.CreatePolygon(newLinearRing, null)); }
private void StartNewLine(ICoordinate worldPos) { List <ICoordinate> verticies = new List <ICoordinate> { GeometryFactory.CreateCoordinate(worldPos.X, worldPos.Y), GeometryFactory.CreateCoordinate(worldPos.X, worldPos.Y) }; ILineString lineString = GeometryFactory.CreateLineString(verticies.ToArray()); ((DataTableFeatureProvider)newLineLayer.DataSource).Clear(); newLineLayer.DataSource.Add(lineString); adding = true; ActualAutoCurve = AutoCurve; ActualMinDistance = MinDistance; }
public override void OnMouseMove(ICoordinate worldPosition, MouseEventArgs e) { if (startCoordinate == null) { return; } if (!((MouseButtons.None == e.Button) || (MouseButtons.Left == e.Button))) { return; } EndCoordinate = GeometryFactory.CreateCoordinate(worldPosition.X, worldPosition.Y); ShowSnap(newArrowLineGeometry, worldPosition); DoDrawing(true); }
public void Initalize_MapInstance() { var map = new Map(new Size(2, 1)); Assert.IsNotNull(map); Assert.IsNotNull(map.Layers); Assert.AreEqual(2f, map.Size.Width); Assert.AreEqual(1f, map.Size.Height); Assert.AreEqual(Color.Transparent, map.BackColor); Assert.AreEqual(1e9, map.MaximumZoom); Assert.AreEqual(1e-4, map.MinimumZoom); Assert.AreEqual(GeometryFactory.CreateCoordinate(0, 0), map.Center, "map.Center should be initialized to (0,0)"); Assert.AreEqual(1000, map.Zoom, "Map zoom should be initialized to 1000.0"); }
public void ImageToWorld() { Map map = new Map(new System.Drawing.Size(1000, 500)); map.Zoom = 360; map.Center = GeometryFactory.CreateCoordinate(0, 0); Assert.AreEqual(GeometryFactory.CreateCoordinate(0, 0), map.ImageToWorld(new System.Drawing.PointF(500, 250))); Assert.AreEqual(GeometryFactory.CreateCoordinate(-180, 90), map.ImageToWorld(new System.Drawing.PointF(0, 0))); Assert.AreEqual(GeometryFactory.CreateCoordinate(-180, -90), map.ImageToWorld(new System.Drawing.PointF(0, 500))); Assert.AreEqual(GeometryFactory.CreateCoordinate(180, 90), map.ImageToWorld(new System.Drawing.PointF(1000, 0))); Assert.AreEqual(GeometryFactory.CreateCoordinate(180, -90), map.ImageToWorld(new System.Drawing.PointF(1000, 500))); }
public void ImageToWorld() { Map map = new Map(new Size(1000, 500)) { Zoom = 360, Center = GeometryFactory.CreateCoordinate(0, 0) }; Assert.AreEqual(GeometryFactory.CreateCoordinate(0, 0), map.ImageToWorld(new PointF(500, 250))); Assert.AreEqual(GeometryFactory.CreateCoordinate(-180, 90), map.ImageToWorld(new PointF(0, 0))); Assert.AreEqual(GeometryFactory.CreateCoordinate(-180, -90), map.ImageToWorld(new PointF(0, 500))); Assert.AreEqual(GeometryFactory.CreateCoordinate(180, 90), map.ImageToWorld(new PointF(1000, 0))); Assert.AreEqual(GeometryFactory.CreateCoordinate(180, -90), map.ImageToWorld(new PointF(1000, 500))); }
public void AddingALayerShouldCauseZoomToExtendsIfNoValidExtendsBefore() { var map = new Map(new Size(10, 100)) { Center = GeometryFactory.CreateCoordinate(90, 900) }; //now add a layer with defined extends var geometry = GeometryFromWKT.Parse("LINESTRING (20 20, 20 30, 30 30, 30 20, 40 20)"); var dataSource = new DataTableFeatureProvider(geometry); var vectorLayerWithExtends = new VectorLayer("Layer with extends") { DataSource = dataSource }; map.Layers.Add(vectorLayerWithExtends); Assert.AreEqual(new Envelope(19, 41, -85, 135), map.Envelope); }
/// <summary> /// Initializes a new map /// </summary> /// <param name="size">Size of map in pixels</param> public Map(Size size) { name = "map"; maximumZoom = double.MaxValue; minimumZoom = 0; center = GeometryFactory.CreateCoordinate(0, 0); zoom = 1000; pixelAspectRatio = 1.0; Size = size; Layers = new EventedList <ILayer>(); BackColor = Color.Transparent; mapTransform = new Matrix(); mapTransformInverted = new Matrix(); UpdateDimensions(); }
public void Clone() { var map = new Map(new Size(10, 100)) { Center = GeometryFactory.CreateCoordinate(90, 900) }; map.Layers.Add(new VectorLayer("Layer 1")); map.Layers.Add(new VectorLayer("Layer 3")); map.Layers.Add(new VectorLayer("Layer 2")); var clonedMap = (Map)map.Clone(); Assert.AreEqual(map.Name, clonedMap.Name); Assert.AreEqual(map.Layers.Count, clonedMap.Layers.Count); Assert.AreEqual(map.Size.Width, clonedMap.Size.Width); Assert.AreEqual(map.Size.Height, clonedMap.Size.Height); Assert.AreEqual(map.Center.X, clonedMap.Center.X); Assert.AreEqual(map.Center.Y, clonedMap.Center.Y); Assert.AreEqual(map.Zoom, clonedMap.Zoom, 1e-10); }
/// <summary> /// Intersection scalar (used for weighting in building the tree) /// #Todo /// </summary> private string LongestAxis(IEnvelope box) { ICoordinate boxdim = GeometryFactory.CreateCoordinate(box.MaxX - box.MinX, box.MaxY - box.MinY); string la = String.Empty; // longest axis double lav = 0; // longest axis length // for each dimension //for (uint ii = 0; ii < 2; ii++) //{ // check if its longer if (boxdim.X > lav) { la = "X"; lav = boxdim.X; } if (boxdim.Y > lav) { la = "Y"; lav = boxdim.Y; } return(la); }
public override void OnMouseMove(ICoordinate worldPosition, MouseEventArgs e) { if (VectorLayer == null) { return; } if (!(MouseButtons.None == e.Button || MouseButtons.Left == e.Button)) { return; } if (startCoordinate != null) { EndCoordinate = GeometryFactory.CreateCoordinate(worldPosition.X, worldPosition.Y); } Snap(worldPosition); StartDrawing(); DoDrawing(true); StopDrawing(); }
/// <summary> /// Reads and parses the geometry with ID 'oid' from the ShapeFile /// </summary> /// <remarks><see cref="FilterDelegate">Filtering</see> is not applied to this method</remarks> /// <param name="oid">Object ID</param> /// <returns>geometry</returns> private unsafe IGeometry ReadGeometry(int oid) { if (_ShapeType == ShapeType.Polygon || _ShapeType == ShapeType.PolygonM || _ShapeType == ShapeType.PolygonZ) { return(ReadPolygon(oid)); } var dataPtr = zeroPtr + recordHeaders[oid].Offset + 8; var type = *((ShapeType *)dataPtr); if (type == ShapeType.Null) { return(null); } dataPtr += 4; if (IsPoint) { var x = *((double *)dataPtr); dataPtr += 8; var y = *((double *)dataPtr); return(GeometryFactory.CreatePoint(x, y)); } if (_ShapeType == ShapeType.Multipoint || _ShapeType == ShapeType.MultiPointM || _ShapeType == ShapeType.MultiPointZ) { dataPtr += 32; // min/max box var points = new List <IPoint>(); var nPoints = *(int *)dataPtr; // get the number of points dataPtr += 4; if (nPoints == 0) { return(null); } for (var i = 0; i < nPoints; i++) { var x = *((double *)dataPtr); dataPtr += 8; var y = *((double *)dataPtr); dataPtr += 8; points.Add(GeometryFactory.CreatePoint(x, y)); } return(GeometryFactory.CreateMultiPoint(points.ToArray())); } if (_ShapeType == ShapeType.PolyLine || _ShapeType == ShapeType.Polygon || _ShapeType == ShapeType.PolyLineM || _ShapeType == ShapeType.PolygonM || _ShapeType == ShapeType.PolyLineZ || _ShapeType == ShapeType.PolygonZ) { dataPtr += 32; // min/max int nParts = *(int *)dataPtr; // get number of parts (segments) dataPtr += 4; if (nParts == 0) { return(null); } int nPoints = *((int *)dataPtr); // get number of points dataPtr += 4; var segments = new int[nParts + 1]; //Read in the segment indexes for (int b = 0; b < nParts; b++) { segments[b] = *((int *)dataPtr); dataPtr += 4; } //add end point segments[nParts] = nPoints; if ((int)_ShapeType % 10 == 3) { var mline = new List <ILineString>(); for (var lineId = 0; lineId < nParts; lineId++) { var line = new List <ICoordinate>(); for (var i = segments[lineId]; i < segments[lineId + 1]; i++) { var x = *((double *)dataPtr); dataPtr += 8; var y = *((double *)dataPtr); dataPtr += 8; line.Add(GeometryFactory.CreateCoordinate(x, y)); } //line.Vertices.Add(new SharpMap.Geometries.Point( mline.Add(GeometryFactory.CreateLineString(line.ToArray())); } if (mline.Count == 1) { return(mline[0]); } return(GeometryFactory.CreateMultiLineString(mline.ToArray())); } // TODO: check it! //(_ShapeType == ShapeType.Polygon etc...) { //First read all the rings //List<SharpMap.Geometries.LinearRing> rings = new List<SharpMap.Geometries.LinearRing>(); var rings = new List <ILinearRing>(); for (int RingID = 0; RingID < nParts; RingID++) { //SharpMap.Geometries.LinearRing ring = new SharpMap.Geometries.LinearRing(); var ring = new List <ICoordinate>(); for (int i = segments[RingID]; i < segments[RingID + 1]; i++) { ring.Add(GeometryFactory.CreateCoordinate(brShapeFile.ReadDouble(), brShapeFile.ReadDouble())); } // polygon should be closed, try to fix if (!ring[ring.Count - 1].Equals2D(ring[0])) { ring.Add(GeometryFactory.CreateCoordinate(ring[0].X, ring[0].Y)); } //ring.Vertices.Add(new SharpMap.Geometries.Point rings.Add(GeometryFactory.CreateLinearRing(ring.ToArray())); } var IsCounterClockWise = new bool[rings.Count]; int PolygonCount = 0; for (int i = 0; i < rings.Count; i++) { IsCounterClockWise[i] = GeometryFactory.IsCCW(rings[i].Coordinates); if (!IsCounterClockWise[i]) { PolygonCount++; } } if (PolygonCount == 1) //We only have one polygon { ILinearRing shell = rings[0]; var holes = new List <ILinearRing>(); if (rings.Count > 1) { for (int i = 1; i < rings.Count; i++) { holes.Add(rings[i]); } } return(GeometryFactory.CreatePolygon(shell, holes.ToArray())); } else { var polys = new List <IPolygon>(); ILinearRing shell = rings[0]; var holes = new List <ILinearRing>(); for (int i = 1; i < rings.Count; i++) { if (!IsCounterClockWise[i]) { polys.Add(GeometryFactory.CreatePolygon(shell, null)); shell = rings[i]; } else { holes.Add(rings[i]); } } polys.Add(GeometryFactory.CreatePolygon(shell, holes.ToArray())); return(GeometryFactory.CreateMultiPolygon(polys.ToArray())); } } } else { throw (new ApplicationException("Shapefile type " + _ShapeType.ToString() + " not supported")); } }
private unsafe IGeometry ReadPolygon(int oid) { var dataPtr = zeroPtr + recordHeaders[oid].Offset; var polygonRecord = (PolygonRecordP *)(dataPtr + 8); //First read all the rings int offset = polygonRecord->DataOffset; int parts = polygonRecord->NumParts; var rings = new ILinearRing[parts]; for (int part = 0; part < parts; ++part) { int points; if ((parts - part) > 1) { points = polygonRecord->PartOffsets[part + 1] - polygonRecord->PartOffsets[part]; } else { points = polygonRecord->NumPoints - polygonRecord->PartOffsets[part]; } if (points <= 1) { continue; } var ring = new ICoordinate[points]; int index = 0; PointD *pointPtr = (PointD *)(dataPtr + 8 + offset + (polygonRecord->PartOffsets[part] << 4)); PointD point = *(pointPtr++); ring[index] = GeometryFactory.CreateCoordinate(point.X, point.Y); ++index; while (index < points) { point = *(pointPtr++); ring[index] = GeometryFactory.CreateCoordinate(point.X, point.Y); ++index; } // polygon should be closed, try to fix if (!ring[ring.Length - 1].Equals2D(ring[0])) { ring[ring.Length - 1] = GeometryFactory.CreateCoordinate(ring[0].X, ring[0].Y); } rings[part] = GeometryFactory.CreateLinearRing(ring); } if (rings.Length == 1) //We only have one polygon { ILinearRing shell = rings[0]; if (rings.Length > 1) { var holes = new ILinearRing[rings.Length]; for (int i = 1; i < rings.Length; i++) { holes[i] = rings[i]; } return(GeometryFactory.CreatePolygon(shell, holes)); } return(GeometryFactory.CreatePolygon(shell, null)); } else { var polys = new List <IPolygon>(); ILinearRing shell = rings[0]; var holes = new List <ILinearRing>(); for (int i = 1; i < rings.Length; i++) { if (!GeometryFactory.IsCCW(rings[i].Coordinates)) { polys.Add(GeometryFactory.CreatePolygon(shell, null)); shell = rings[i]; } else { holes.Add(rings[i]); } } polys.Add(GeometryFactory.CreatePolygon(shell, holes.ToArray())); return(GeometryFactory.CreateMultiPolygon(polys.ToArray())); } }