Table of Contents

Source Code WpfDesktopEditionSample ClippingOnLineLayer CS 110210.zip

App.xaml.cs

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
namespace ClippingOnLineLayer
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
    }
}

TestWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.WpfDesktopEdition;
namespace ClippingOnLineLayer
{
    /// <summary>
    /// Interaction logic for TestWindow.xaml
    /// </summary>
    public partial class TestWindow : Window
    {
        private ShapeFileFeatureLayer balticCountriesLayer = null;
        private ShapeFileFeatureLayer balticRailsRoadsLayer = null;
        public TestWindow()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //Sets the correct map unit of the map.
            wpfMap1.MapUnit = GeographyUnit.DecimalDegree;
            wpfMap1.Background = new SolidColorBrush(Color.FromRgb(148, 196, 243));
            WorldMapKitWmsWpfOverlay worldMapKitWmsWpfOverlay = new WorldMapKitWmsWpfOverlay();
            wpfMap1.Overlays.Add(worldMapKitWmsWpfOverlay);
            //Polygon based shapefile used for clipping
            balticCountriesLayer = new ShapeFileFeatureLayer(@"..\..\Data\baltic_countries.shp", ShapeFileReadWriteMode.ReadOnly);
            balticCountriesLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle =
                AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(60, GeoColor.StandardColors.Red), GeoColor.StandardColors.DarkGray, 2);
            balticCountriesLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            //Line based shapefile used for creating the clipped shapefile.
            balticRailsRoadsLayer = new ShapeFileFeatureLayer(@"..\..\Data\baltic_rail_roads.shp", ShapeFileReadWriteMode.ReadOnly);
            balticRailsRoadsLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle
                (GeoColor.StandardColors.Red, 2, LineDashStyle.Dash, true);
            balticRailsRoadsLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            LayerOverlay layerOverlay = new LayerOverlay();
            layerOverlay.Layers.Add("BalticCountries", balticCountriesLayer);
            layerOverlay.Layers.Add("BalticRailRoads", balticRailsRoadsLayer);
            wpfMap1.Overlays.Add("StaticOverlay", layerOverlay);
            //Adds the InMemoryFeatureLayer with of the polygon of Latvia used for clipping.
            InMemoryFeatureLayer inMemoryFeatureLayer = new InMemoryFeatureLayer();
            inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle
                             (GeoColor.StandardColors.Transparent, GeoColor.FromArgb(150, GeoColor.StandardColors.Red), 2);
            inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            balticCountriesLayer.Open();
            Collection<Feature> features = balticCountriesLayer.FeatureSource.GetFeaturesByColumnValue("cntry_name", "Latvia");
            balticCountriesLayer.Close();
            inMemoryFeatureLayer.InternalFeatures.Add(features[0]);
            LayerOverlay dynamicOverlay = new LayerOverlay();
            dynamicOverlay.Layers.Add("Latvia", inMemoryFeatureLayer);
            wpfMap1.Overlays.Add("DynamicOverlay", dynamicOverlay);
            balticRailsRoadsLayer.Open();
            wpfMap1.CurrentExtent = balticRailsRoadsLayer.GetBoundingBox();
            balticRailsRoadsLayer.Close();
            wpfMap1.Refresh();
        }
        private void btnClip_Click(object sender, RoutedEventArgs e)
        {
            //deletes the files for the clipped shapefile if they already exist.
            if (File.Exists(@"..\..\Data\baltic_rail_roads_clip.shp"))
            {
                DeleteClipFiles();
            }
            //Gets the MultipolygonShape of Latvia used for clipping.
            balticCountriesLayer.Open();
            Collection<Feature> features = balticCountriesLayer.FeatureSource.GetFeaturesByColumnValue("cntry_name", "Latvia");
            balticCountriesLayer.Close();
            MultipolygonShape multiPolygonShape = (MultipolygonShape)features[0].GetShape();
            //Calls the ClipLineBasedShapeFile function to get the clipped layer.
            ShapeFileFeatureLayer clipLayer = ClipLineBasedShapeFile(balticRailsRoadsLayer, @"..\..\Data\baltic_rail_roads_clip.shp", multiPolygonShape);
            LayerOverlay layerOverlay = (LayerOverlay)wpfMap1.Overlays["StaticOverlay"];
            layerOverlay.Layers.Remove("BalticRailRoads");
            //Adds the new clipped layer of baltic_rail_roads_clip.
            ShapeFileFeatureLayer.BuildIndexFile(@"..\..\Data\baltic_rail_roads_clip.shp", BuildIndexMode.DoNotRebuild);
            clipLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle
                (GeoColor.StandardColors.Red, 2, LineDashStyle.Dash, true);
            clipLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            layerOverlay.Layers.Add("ClippedBalticRailRoads", clipLayer);
            wpfMap1.Refresh(layerOverlay);
        }
        private ShapeFileFeatureLayer ClipLineBasedShapeFile(ShapeFileFeatureLayer shapeFileFeatureLayer, string outputShapeFileFeatureLayerPath, AreaBaseShape ClippingShape)
        {
            //Gets the columns from the line based shapefile.
            shapeFileFeatureLayer.Open();
            Collection<DbfColumn> dbfColumns = ((ShapeFileFeatureSource)shapeFileFeatureLayer.FeatureSource).GetDbfColumns();
            ShapeFileFeatureLayer.CreateShapeFile(ShapeFileType.Polyline, outputShapeFileFeatureLayerPath, dbfColumns);
            ShapeFileFeatureSource clippedShapeFileFeatureSource = new ShapeFileFeatureSource(outputShapeFileFeatureLayerPath, ShapeFileReadWriteMode.ReadWrite);
            //Gets the features with Spatial Query that will be used for the clipping.
            Collection<Feature> features = shapeFileFeatureLayer.QueryTools.GetFeaturesIntersecting(ClippingShape, ReturningColumnsType.AllColumns);
            shapeFileFeatureLayer.Close();
            //Loops thru all the features from the Spatial Query.
            clippedShapeFileFeatureSource.Open();
            clippedShapeFileFeatureSource.BeginTransaction();
            foreach (Feature feature in features)
            {
                //Gets the MultilineShape and clip it using GetIntersection geometric function.
                MultilineShape currentMultilineShape = (MultilineShape)(feature.GetShape());
                MultilineShape clippedMultilineShape = currentMultilineShape.GetIntersection(ClippingShape);
                //Adds the feature to the clipped layer with the clipped MultilineShape with its ColumnValues.
                Dictionary<string, string> Columns = feature.ColumnValues;
                Feature clippedFeature = new Feature(clippedMultilineShape, Columns);
                clippedShapeFileFeatureSource.AddFeature(clippedFeature);
            }
            clippedShapeFileFeatureSource.CommitTransaction();
            clippedShapeFileFeatureSource.Close();
            //Returns the clipped ShapeFileFeatureLayer.
            ShapeFileFeatureLayer clippedShapeFileFeatureLayer = new ShapeFileFeatureLayer(outputShapeFileFeatureLayerPath);
            return clippedShapeFileFeatureLayer;
        }
        private void DeleteClipFiles()
        {
            File.Delete(@"..\..\Data\baltic_rail_roads_clip.shp");
            File.Delete(@"..\..\Data\baltic_rail_roads_clip.ids");
            File.Delete(@"..\..\Data\baltic_rail_roads_clip.idx");
            File.Delete(@"..\..\Data\baltic_rail_roads_clip.dbf");
            File.Delete(@"..\..\Data\baltic_rail_roads_clip.shx");
        }
       private void wpfMap1_MouseMove(object sender, MouseEventArgs e)
        {
            //Gets the PointShape in world coordinates from screen coordinates.
            Point point = e.MouseDevice.GetPosition(null);
            ScreenPointF screenPointF = new ScreenPointF((float)point.X, (float)point.Y);
            PointShape pointShape = ExtentHelper.ToWorldCoordinate(wpfMap1.CurrentExtent, screenPointF, (float)wpfMap1.Width, (float)wpfMap1.Height);
            textBox1.Text = "X: " + DecimalDegreesHelper.GetDegreesMinutesSecondsStringFromDecimalDegree(pointShape.X) +
                          "  Y: " + DecimalDegreesHelper.GetDegreesMinutesSecondsStringFromDecimalDegree(pointShape.Y);
           }
 
    }
}