David,
This is an advanced requirement. We can achieve this by write our won EditInterativeOverlay logic.
Following is the code basically we write according to your requirement, and you can modify it if you want.
public class CustomerEditInteractiveOverlay : EditInteractiveOverlay
{
private ResizeMode resizeMode;
public CustomerEditInteractiveOverlay()
{
}
public ResizeMode ResizeMode
{
get { return resizeMode; }
set { resizeMode = value; }
}
protected override Feature AddVertexCore(Feature targetFeature, PointShape targetPointShape, double searchingTolerance)
{
return new Feature();
}
protected override IEnumerable<Feature> CalculateResizeControlPointsCore(Feature feature)
{
Collection<Feature> resizeControlPoints = new Collection<Feature>();
PolygonShape polygonShape = feature.GetShape() as PolygonShape;
if (polygonShape != null)
{
foreach (Vertex vertex in polygonShape.OuterRing.Vertices)
{
resizeControlPoints.Add(new Feature(vertex, feature.Id));
}
}
return resizeControlPoints;
}
protected override Feature ResizeFeatureCore(Feature sourceFeature, PointShape sourceControlPoint, PointShape targetControlPoint)
{
Feature editedFeature = new Feature();
PolygonShape polygonShape = sourceFeature.GetShape() as PolygonShape;
int fixedPointIndex = GetFixedPointIndex(polygonShape, sourceControlPoint);
PointShape fixedPointShape = new PointShape(polygonShape.OuterRing.Vertices[fixedPointIndex]);
if (resizeMode == ResizeMode.OnePointFixed)
{
RectangleShape newRectangleShape = new LineShape(new Vertex[] { new Vertex(fixedPointShape), new Vertex(targetControlPoint) }).GetBoundingBox();
editedFeature = new Feature(newRectangleShape.GetWellKnownBinary(), sourceFeature.Id, sourceFeature.ColumnValues);
if (!string.Equals(polygonShape.GetBoundingBox().GetWellKnownText(), polygonShape.GetWellKnownText()))
{
editedFeature = base.ResizeFeatureCore(sourceFeature, sourceControlPoint, targetControlPoint);
}
}
else
{
editedFeature = base.ResizeFeatureCore(sourceFeature, sourceControlPoint, targetControlPoint);
}
return editedFeature;
}
private int GetFixedPointIndex(PolygonShape sourcePolygonShape, PointShape sourceControlPointShape)
{
int index = 0;
for (int i = 0; i < sourcePolygonShape.OuterRing.Vertices.Count; i++)
{
Vertex vertex = sourcePolygonShape.OuterRing.Vertices[i];
if (Math.Abs(vertex.X - sourceControlPointShape.X) <= 10E-6 && Math.Abs(vertex.Y - sourceControlPointShape.Y) <= 10E-6)
{
index = i;
break;
}
}
int fixedPointIndex = 0;
if (index <= 2)
{
fixedPointIndex = index + 2;
}
else
{
fixedPointIndex = index - 2;
}
return fixedPointIndex;
}
}
public enum ResizeMode
{
Default = 0,
Standard = 1,
OnePointFixed = 2
}
Based on this CustomerEditInteractiveOverlay, We can use it in the following way.
winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
//ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"..\..\..\..\..\PostsData\Countries02.shp", ShapeFileReadWriteMode.ReadOnly);
//worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
//worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
//LayerOverlay worldOverlay = new LayerOverlay();
//worldOverlay.Layers.Add("WorldLayer", worldLayer);
//winformsMap1.Overlays.Add("WorldOverlay", worldOverlay);
CustomerEditInteractiveOverlay customerEditOverlay = new CustomerEditInteractiveOverlay();
customerEditOverlay.ResizeMode = ResizeMode.OnePointFixed;
winformsMap1.EditOverlay = customerEditOverlay;
winformsMap1.ZoomLevelSnapping = ZoomLevelSnappingMode.None;
winformsMap1.CurrentExtent = new RectangleShape(-180, 90, 180, -90);
winformsMap1.Refresh();
Any queries just let me know.
Thanks.
Yale.