100% found this document useful (1 vote)
292 views

DotSpatial Tutorials DotSpatial Tutorial 4

This document provides a tutorial on using DotSpatial to perform shape file, attribute table, and printing operations. The tutorial has 5 steps: 1) Download the DotSpatial class library, 2) Add DotSpatial references and change compile options in Visual Studio, 3) Add DotSpatial controls to the toolbox, 4) Design a graphical user interface with panels to display operations, legends, maps, and attributes, and 5) Write code to implement map operations such as creating and saving shapefiles for points, polylines and polygons, viewing and editing attribute tables, and printing maps. Specific tasks covered include creating point, polyline and polygon shapefiles; adding, removing and updating attribute table columns; and setting print properties like the north arrow

Uploaded by

muhtaseb ib
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
292 views

DotSpatial Tutorials DotSpatial Tutorial 4

This document provides a tutorial on using DotSpatial to perform shape file, attribute table, and printing operations. The tutorial has 5 steps: 1) Download the DotSpatial class library, 2) Add DotSpatial references and change compile options in Visual Studio, 3) Add DotSpatial controls to the toolbox, 4) Design a graphical user interface with panels to display operations, legends, maps, and attributes, and 5) Write code to implement map operations such as creating and saving shapefiles for points, polylines and polygons, viewing and editing attribute tables, and printing maps. Specific tasks covered include creating point, polyline and polygon shapefiles; adding, removing and updating attribute table columns; and setting print properties like the north arrow

Uploaded by

muhtaseb ib
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 36

Introduction to Programming with DotSpatial

Shape File, Attribute Table Operations


and Printing map in DotSpatial
Tutorial (4)

Purpose of this tutorial: Become familiar with the following operations in DotSpatial:

1. Shape file related operations.

1.1) Creating the following types of shape files: Point, Polyline, Polygon

1.2) Add an attribute to the above shape files.

1.3) Save the shape files with user defined attributes.

2. Attribute table related operations.

2.1) View an attribute table of a shape file.

2.2) Add a new column into an attribute table.

2.3) Remove a column from an attribute table.

2.4) Update an attribute column in the shapefile.

2.3) Export an attribute to table to MS Excel worksheet.

3. Printing a map in DotSpatial.

3.1) Implement a print operation.

3.2) Set a print document properties. (North Arrow, Legend, Scale bar, Title)

This tutorial has 5 important steps.

Step 1: Download the DotSpatial class library

Step 2: Add the DotSpatial reference and change the compile option.

Step 3: Add the DotSpatial Controls into the Visual Studio Toolbox.

Step 4: Design the GUI. (GUI - Graphical User Interface)

Step 5: Write the code for implementing the map operations.

Teva ~ Veluppillai Page 1


Introduction to Programming with DotSpatial

Step 1: Download the DotSpatial class library

This step is as same as the Tutorial #1 step 1.

Step 2: Add the DotSpatial reference and change the compile option.

2.1) Add the required DotSpatial reference in the visual studio development environment.

Create a new VB or C# application and right click over the project on the solution explorer. On the
context menu select the add reference and add the following reference from the DotSpatial folder.

DotSpatial.Data.Forms.dll, DotSpatial.Symbology.dll, DotSpatial.Controls.dll, DotSpatial.Projections.dll,


DotSpatial.Data.dll, DotSpatial.Topology.dll

Fig. 1 Required references.

Teva ~ Veluppillai Page 2


Introduction to Programming with DotSpatial

Fig. 2 Required references on Visual Studio Development Environment.

2.2) Change the compile option from .Net FrameWork 4 Client Profile to .Net FrameWork 4

This step is as same as the Tutorial # 1 step 2.2.

Step 3: Add the DotSpatial Controls into the Visual Studio Toolbox.

This step is as same as the Tutorial # 1 step 3.

Step 4: Design the GUI. (Graphical User Interface)

Design the GUI as follows:

Teva ~ Veluppillai Page 3


Introduction to Programming with DotSpatial

Fig.3. Final GUI

Interface design considerations.

1. Add four panel controls. Panel control's properties should be as follows:

Properties Panel1 Panel2 Panel3 Panel4


Name pnlOperations pnlLegend pnlMap pnlAttribute
Dock Top Left Fill Bottom
Note: Set the border style of the panels to Fixed Single (Optional)

2. Add a menu strip control on the pnlOperations. Menu should be contains the following menu items.

2.1) Main menu item: File, Shapefile Operations, Map Options, and Attribute Table Operations

2.2) Sub menu items:

Under File menu item create 3 sub menu items as follows: Load, Clear, Exit

Those implementations can be found in ‘Tutorial 2’.

Under the Shapefile Operations create the following sub menu items : Point , Polyline, Polygon

Under the Point sub menu item create the following Sub menu items: Create Point Shapefile, Save Point
Shapefile.

Teva ~ Veluppillai Page 4


Introduction to Programming with DotSpatial

Under the Polyline sub menu item create the following Sub menu items: Create Polyline Shapefile, Save
Polyline Shapefile.

Under the Polygon sub menu item create the following Sub menu items: Create Polygon Shapefile, Save
Polygon Shapefile.

Under the Map Options menu item create the following sub menu items: Default, Information,
Measurement, Zoom In, Zoom Out, Zoom to Extent, Pan, and Print Map

Under the Attribute Table Operations menu item create the following sub menu items: View Attribute
table, Add a column in the attribute table, Save the colum in ShapeFile, Delete a column in the attribute
table, Update attribute table in Shapefile, Export Attribute table to Excel.

Fig. 4. Menu Items

3. Add the Map and legend controls on the form.

3.1 ) Add the map control on the pnlMap control and add legend control on the pnlLegend.

Map and Legend control are located on the Toolbox under DotSpatial controls.

Set the map properties as follows: Dock = Fill, Legend = Legend1

Set the legend properties as follows: Dock = Fill

4. Add a DataGridView on the pnlAttribute.

Set its properties as follows: Name : dgvAttributeTable , Dock = Fill

Step 5: Write the code for implementing the map operations.

5.1 ) Import the following namespaces:

VB

Imports DotSpatial.Controls
Imports DotSpatial.Data
Imports DotSpatial.Symbology
Imports DotSpatial.Topology

C#
using DotSpatial.Controls;

Teva ~ Veluppillai Page 5


Introduction to Programming with DotSpatial

using DotSpatial.Data;
using DotSpatial.Symbology;
using DotSpatial.Topology;

Create a Point shapefile.

Declare the following class level variables.

VB

'which type of shapefile is created


Dim shapeType As String

#Region "Point shapefile class level variable"

'the new point feature set


Dim pointF As New FeatureSet(FeatureType.Point)

'the id of point
Dim pointID As Integer = 0

'to differentiate the right and left mouse click


Dim pointmouseClick As Boolean = False

#End Region

C#

//which type of shapefile is created


string shapeType;
#region Point ShapeFile class level variable

//the new point feature set


FeatureSet pointF = new FeatureSet(FeatureType.Point);

//the id of point
int pointID = 0;

//to differentiate the right and left mouse click


bool pointmouseClick = false;

#endregion

Write the following code in the "CreatePointShapeFileToolStripMenuItem_Click" event

VB
Private Sub CreatePointShapeFileToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles CreatePointShapeFileToolStripMenuItem.Click
'Change the cursor style
Map1.Cursor = Cursors.Cross
'set the shape type to the classlevel string variable

Teva ~ Veluppillai Page 6


Introduction to Programming with DotSpatial

'we are going to use this variable in select case statement


shapeType = "Point"
'set projection
pointF.Projection = Map1.Projection
'initialize the featureSet attribute table
Dim column As New DataColumn("PointID")
pointF.DataTable.Columns.Add(column)
'add the featureSet as map layer
Dim pointLayer As MapPointLayer = Map1.Layers.Add(pointF)
'Create a new symbolizer
Dim symbol As New PointSymbolizer(Color.Red, DotSpatial.Symbology.PointShape.Ellipse, 3)
'Set the symbolizer to the point layer
pointLayer.Symbolizer = symbol
'Set the legentText as point
pointLayer.LegendText = "point"
'Set left mouse click as true
pointmouseClick = True
End Sub

C#

private void createPointShapefileToolStripMenuItem_Click(object sender, EventArgs e)


{
//Change the cursor style
map1.Cursor = Cursors.Cross;
//set the shape type to the classlevel string variable
//we are going to use this variable in select case statement
shapeType = "Point";
//set projection
pointF.Projection = map1.Projection;
//initialize the featureSet attribute table
DataColumn column = new DataColumn("PointID");
pointF.DataTable.Columns.Add(column);
//add the featureSet as map layer
MapPointLayer pointLayer = (MapPointLayer)map1.Layers.Add(pointF);
//Create a new symbolizer
PointSymbolizer symbol = new PointSymbolizer(Color.Red, DotSpatial.Symbology.PointShape.Ellipse, 3);
//Set the symbolizer to the point layer
pointLayer.Symbolizer = symbol;
//Set the legentText as point
pointLayer.LegendText = "point";
//Set left mouse click as true
pointmouseClick = true;
}

Write the following code in the Map mouse down event.

Generate the Map1 mouse down event. : Select the map control and press the F4 key for getting
its properties window. On the properties window select the event tab and on the event tab double click
over the Mouse down.

Teva ~ Veluppillai Page 7


Introduction to Programming with DotSpatial

Fig. 5. Map mouse down event.

Write the following code in the Map1_MouseDown event.

VB

Select Case shapeType

Case "Point"
If e.Button = MouseButtons.Left Then
If (pointmouseClick) Then
'This method is used to convert the screen coordinate to map coordinate
'e.location is the mouse click point on the map control
Dim coord As Coordinate = Map1.PixelToProj(e.Location)
'Create a new point
'Input parameter is clicked point coordinate
Dim point As New DotSpatial.Topology.Point(coord)
'Add the point into the Point Feature
'assigning the point feature to IFeature because via it only we can set the attributes.
Dim currentFeature As IFeature = pointF.AddFeature(point)
'increase the point id
pointID = pointID + 1
'set the ID attribute
currentFeature.DataRow("PointID") = pointID
'refresh the map
Map1.ResetBuffer()
End If
Else
Map1.Cursor = Cursors.Default
pointmouseClick = False
End If
End Select

Teva ~ Veluppillai Page 8


Introduction to Programming with DotSpatial

C#

switch (shapeType)
{
case "Point" :
if (e.Button == MouseButtons.Left)
{
if ((pointmouseClick))
{
//This method is used to convert the screen cordinate to map coordinate
//e.location is the mouse click point on the map control
Coordinate coord = map1.PixelToProj(e.Location);

//Create a new point


//Input parameter is clicked point coordinate
DotSpatial.Topology.Point point = new DotSpatial.Topology.Point(coord);

//Add the point into the Point Feature


//assigning the point feature to IFeature because via it only we can set the attributes.
IFeature currentFeature = pointF.AddFeature(point);

//increase the point id


pointID = pointID + 1;

//set the ID attribute


//currentFeature.DataRow["PointID"] = pointID;

//refresh the map


map1.ResetBuffer();
}
}

else
{
//mouse right click
map1.Cursor = Cursors.Default;
pointmouseClick = false;
}
break;

Save a point shape file: Write the following code into SavePointShapeFileToolStripMenuItem_Click
event.

VB

Private Sub SavePointShapeFileToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles SavePointShapeFileToolStripMenuItem.Click
pointF.SaveAs("point.shp", True)
MsgBox("The point shapefile has been saved.")
Map1.Cursor = Cursors.Arrow
End Sub

C#
private void SavePointShapeFileToolStripMenuItem_Click(object sender, EventArgs e)
{

Teva ~ Veluppillai Page 9


Introduction to Programming with DotSpatial

pointF.SaveAs("point.shp", true);
MessageBox.Show("The point shapefile has been saved.");
map1.Cursor = Cursors.Arrow;
}

Output of the above code:

Fig. 6. Create a point shape file.

Create Polyline shapefile.

Declare the following class level variables.

VB

#Region "Polyline shapefile class level variables"

'the line layer


Dim lineLayer As MapLineLayer

'the line feature set


Dim lineF As New FeatureSet(FeatureType.Line)

Dim lineID As Integer = 0

'boolean variable for first time mouse click


Dim firstClick As Boolean = False

'It controls the drawing the polyline after the polyline saved operation.
Dim linemouseClick As Boolean = False

#End Region

Teva ~ Veluppillai Page 10


Introduction to Programming with DotSpatial

C#

#region Polyline ShapeFile class level variables

MapLineLayer lineLayer = default(MapLineLayer);

//the line feature set


FeatureSet lineF = new FeatureSet(FeatureType.Line);

int lineID = 0;

//boolean variable for first time mouse click


bool firstClick = false;

//It controls the drawing the polyline after the polyline saved operation.
bool linemouseClick = false;

#endregion

Write the following code into CreatePolylineShapeFileToolStripMenuItem_Click event

VB

Private Sub CreatePolylineShapeFileToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles CreatePolylineShapeFileToolStripMenuItem.Click
'initialize polyline feature set
Map1.Cursor = Cursors.Cross

'set shape type


shapeType = "line"

'set projection
lineF.Projection = Map1.Projection

'initialize the featureSet attribute table


Dim column As New DataColumn("LineID")

If Not (lineF.DataTable.Columns.Contains("LineID")) Then


lineF.DataTable.Columns.Add(column)
End If

'add the featureSet as map layer


lineLayer = Map1.Layers.Add(lineF)

Dim symbol As New LineSymbolizer(Color.Blue, 2)


lineLayer.Symbolizer = symbol
lineLayer.LegendText = "line"

firstClick = True
linemouseClick = true;
End Sub

Teva ~ Veluppillai Page 11


Introduction to Programming with DotSpatial

C#

private void CreatePolylineShapeFileToolStripMenuItem_Click(object sender, EventArgs e)


{

//Change the mouse cursor


map1.Cursor = Cursors.Cross;

//set shape type


shapeType = "line";

//set projection
lineF.Projection = map1.Projection;

//initialize the featureSet attribute table


DataColumn column = new DataColumn("LineID");

if (!lineF.DataTable.Columns.Contains("LineID"))
{
lineF.DataTable.Columns.Add(column);
}

//add the featureSet as map layer


lineLayer = (MapLineLayer)map1.Layers.Add(lineF);

//Set the symbolizer to the line feature.


LineSymbolizer symbol = new LineSymbolizer(Color.Blue, 2);
lineLayer.Symbolizer = symbol;
lineLayer.LegendText = "line";

firstClick = true;

linemouseClick = true;
}

Write the following code in the Map1_MouseDown event.

VB

Case "line"
If e.Button = MouseButtons.Left Then
'left click - fill array of coordinates
'coordinate of clicked point
Dim coord As Coordinate = Map1.PixelToProj(e.Location)
If (linemouseClick) Then
'first time left click - create empty line feature
If firstClick Then
'Create a new List called lineArray.
'In List we need not define the size and also
'Here this list will store the Coordinates
'We are going to store the mouse click coordinates into this array.
Dim lineArray As New List(Of Coordinate)
'Create an instance for LineString class.

Teva ~ Veluppillai Page 12


Introduction to Programming with DotSpatial

'We need to pass collection of list coordinates


Dim lineGeometry As New LineString(lineArray)
'Add the linegeometry to line feature
Dim lineFeature As IFeature = lineF.AddFeature(lineGeometry)
'add first coordinate to the line feature
lineFeature.Coordinates.Add(coord)
'set the line feature attribute
lineID = lineID + 1
lineFeature.DataRow("LineID") = lineID
firstClick = False
Else
'second or more clicks - add points to the existing feature
Dim existingFeature As IFeature = lineF.Features(lineF.Features.Count - 1)
existingFeature.Coordinates.Add(coord)
'refresh the map if line has 2 or more points
If existingFeature.Coordinates.Count >= 2 Then
lineF.InitializeVertices()
Map1.ResetBuffer()
End If
End If
End If
Else
'right click - reset first mouse click
firstClick = True
Map1.ResetBuffer()
End If

C#

case "line":
if (e.Button == MouseButtons.Left)
{
//left click - fill array of coordinates
//coordinate of clicked point
Coordinate coord = map1.PixelToProj(e.Location);
if (linemouseClick)
{
//first time left click - create empty line feature
if (firstClick)
{
//Create a new List called lineArray.
//This list will store the Coordinates
//We are going to store the mouse click coordinates into this array.
List<Coordinate> lineArray = new List<Coordinate>();

//Create an instance for LineString class.


//We need to pass collection of list coordinates
LineString lineGeometry = new LineString(lineArray);

//Add the linegeometry to line feature


IFeature lineFeature = lineF.AddFeature(lineGeometry);

Teva ~ Veluppillai Page 13


Introduction to Programming with DotSpatial

//add first coordinate to the line feature


lineFeature.Coordinates.Add(coord);
//set the line feature attribute
lineID = lineID + 1;
lineFeature.DataRow["LineID"] = lineID;
firstClick = false;
}
else
{
//second or more clicks - add points to the existing feature
IFeature existingFeature = lineF.Features[lineF.Features.Count - 1];
existingFeature.Coordinates.Add(coord);

//refresh the map if line has 2 or more points


if (existingFeature.Coordinates.Count >= 2)
{
lineF.InitializeVertices();
map1.ResetBuffer();
}
}
}
}
else
{
//right click - reset first mouse click
firstClick = true;
map1.ResetBuffer();
}
break;
Save the Polyline shapefile

VB
Private Sub SavePolylineShapeFileToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles SavePolylineShapeFileToolStripMenuItem.Click
lineF.SaveAs("c:\MW\line.shp", True)
MsgBox("The line shapefile has been saved in C:\MW\")
Map1.Cursor = Cursors.Arrow
linemouseClick = False;
End Sub

C#

private void savePolylineShapefileToolStripMenuItem_Click(object sender, EventArgs e)


{
lineF.SaveAs("c:\\MW\\line.shp", true);
MessageBox.Show("The line shapefile has been saved in C:\\MW\\");
map1.Cursor = Cursors.Arrow;
linemouseClick = false;
} }

Teva ~ Veluppillai Page 14


Introduction to Programming with DotSpatial

Output of the above code

Fig. 7. Create a polyline shapefile.

Create Polygon shapefile.

Declare the following class level variables.

VB

#Region "Polygon shapefile class level variables"


'the polygon feature set
Dim polygonF As New FeatureSet(FeatureType.Polygon)
Dim polygonID As Integer = 0
Dim polygonmouseClick As Boolean = False
#End Region

C#

#region Polygon ShapeFile class level variables

FeatureSet polygonF = new FeatureSet(FeatureType.Polygon);


int polygonID = 0;

Teva ~ Veluppillai Page 15


Introduction to Programming with DotSpatial

bool polygonmouseClick = false;

#endregion

Write the following code into CreatePolygonShapeFileToolStripMenuItem_Click event

VB

Private Sub CreatePolygonShapeFileToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e


As System.EventArgs) Handles CreatePolygonShapeFileToolStripMenuItem.Click
'initialize polyline feature set
Map1.Cursor = Cursors.Cross

'set shape type


shapeType = "polygon"

'set projection
polygonF.Projection = Map1.Projection

'initialize the featureSet attribute table


Dim column As New DataColumn("PolygonID")
polygonF.DataTable.Columns.Add(column)

'add the featureSet as map layer


Dim polygonLayer As MapPolygonLayer = Map1.Layers.Add(polygonF)

'set a symbology
Dim symbol As New PolygonSymbolizer(Color.Green)
polygonLayer.Symbolizer = symbol

'add the legend text


polygonLayer.LegendText = "polygon"

firstClick = True

polygonmouseClick = True

End Sub

C#

private void CreatePolygonShapeFileToolStripMenuItem_Click(object sender, EventArgs e)


{
//initialize polyline feature set
map1.Cursor = Cursors.Cross;

//set shape type


shapeType = "polygon";

//set projection
polygonF.Projection = map1.Projection;

//initialize the featureSet attribute table

Teva ~ Veluppillai Page 16


Introduction to Programming with DotSpatial

DataColumn column = new DataColumn("PolygonID");

if (!polygonF.DataTable.Columns.Contains("PolygonID"))
{
polygonF.DataTable.Columns.Add(column);
}

//add the featureSet as map layer


MapPolygonLayer polygonLayer = (MapPolygonLayer)map1.Layers.Add(polygonF);

PolygonSymbolizer symbol = new PolygonSymbolizer(Color.Green);

polygonLayer.Symbolizer = symbol;
polygonLayer.LegendText = "polygon";

firstClick = true;

polygonmouseClick = true;

Write the following code in the Map1_MouseDown event.

VB

Case "polygon"
If e.Button = MouseButtons.Left Then
'left click - fill array of coordinates
Dim coord As Coordinate = Map1.PixelToProj(e.Location)
If (polygonmouseClick) Then
'first time left click - create empty line feature
If firstClick Then
'Create a new List called polygonArray.
'Here this list will store the Coordinates
'We are going to store the mouse click coordinates into this array.
Dim polygonArray As New List(Of Coordinate)
'Create an instance for LinearRing class.
'We pass the polygon List to the constructor of this class
Dim polygonGeometry As New LinearRing(polygonArray)
'Add the polygonGeometry instance to PolygonFeature
Dim polygonFeature As IFeature = polygonF.AddFeature(polygonGeometry)
'add first coordinate to the polygon feature
polygonFeature.Coordinates.Add(coord)
'set the polygon feature attribute
polygonID = polygonID + 1
polygonFeature.DataRow("PolygonID") = polygonID
firstClick = False
Else
'second or more clicks - add points to the existing feature
Dim existingFeature As IFeature = polygonF.Features(polygonF.Features.Count - 1)
existingFeature.Coordinates.Add(coord)
'refresh the map if line has 2 or more points

Teva ~ Veluppillai Page 17


Introduction to Programming with DotSpatial

If existingFeature.Coordinates.Count >= 3 Then


'refresh the map
polygonF.InitializeVertices()
Map1.ResetBuffer()
End If
End If
End If
Else
'right click - reset first mouse click
firstClick = True
Map1.Cursor = Cursors.Arrow
End If

C#
case "polygon":

if (e.Button == MouseButtons.Left)
{
//left click - fill array of coordinates
Coordinate coord = map1.PixelToProj(e.Location);

if (polygonmouseClick)
{
//first time left click - create empty line feature
if (firstClick)
{
//Create a new List called polygonArray.

//this list will store the Coordinates


//We are going to store the mouse click coordinates into this array.

List<Coordinate> polygonArray = new List<Coordinate>();

//Create an instance for LinearRing class.


//We pass the polygon List to the constructor of this class
LinearRing polygonGeometry = new LinearRing(polygonArray);

//Add the polygonGeometry instance to PolygonFeature


IFeature polygonFeature = polygonF.AddFeature(polygonGeometry);

//add first coordinate to the polygon feature


polygonFeature.Coordinates.Add(coord);

//set the polygon feature attribute


polygonID = polygonID + 1;
polygonFeature.DataRow["PolygonID"] = polygonID;
firstClick = false;
}
else
{
//second or more clicks - add points to the existing feature
IFeature existingFeature = (IFeature)polygonF.Features[polygonF.Features.Count - 1];

Teva ~ Veluppillai Page 18


Introduction to Programming with DotSpatial

existingFeature.Coordinates.Add(coord);

//refresh the map if line has 2 or more points


if (existingFeature.Coordinates.Count >= 3)
{
//refresh the map
polygonF.InitializeVertices();
map1.ResetBuffer();
}
}
}
}
else
{
//right click - reset first mouse click
firstClick = true;
}
break;

Save the Polygon shapefile

VB

Private Sub SavePolygonShapeFileToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles SavePolygonShapeFileToolStripMenuItem.Click
polygonF.SaveAs("c:\MW\polygon.shp", True)
MsgBox("The polygon shapefile has been saved in C:\MW\")
Map1.Cursor = Cursors.Arrow
polygonmouseClick = False
End Sub

C#

private void SavePolygonShapeFileToolStripMenuItem_Click(object sender, EventArgs e)


{
polygonF.SaveAs("c:\\MW\\polygon.shp", true);
MessageBox.Show("The polygon shapefile has been saved.");
map1.Cursor = Cursors.Arrow;
polygonmouseClick = false;
}

Output of the above code

Teva ~ Veluppillai Page 19


Introduction to Programming with DotSpatial

Fig. 8. Create a polygon shapefile.

Map1 mouse down event complete code: In the above examples the same event is used to implement
different shape functionalities. So, the following code is the complete code for Map1 mouse down event.
The following code shows the all different shape operations.

VB

Private Sub Map1_MouseDown(ByVal sender As Object, ByVal e As


System.Windows.Forms.MouseEventArgs) Handles Map1.MouseDown
Select Case shapeType
Case "Point"
If e.Button = MouseButtons.Left Then
If (pointmouseClick) Then
'This method is used to convert the screen cordinate to map coordinate
'e.location is the mouse click point on the map control
Dim coord As Coordinate = Map1.PixelToProj(e.Location)

'Create a new point


'Input parameter is clicked point coordinate
Dim point As New DotSpatial.Topology.Point(coord)

'Add the point into the Point Feature


'Assigning the point feature to IFeature (Because via it only we can set the attributes.)

Teva ~ Veluppillai Page 20


Introduction to Programming with DotSpatial

Dim currentFeature As IFeature = pointF.AddFeature(point)

'increase the point id


pointID = pointID + 1

'set the ID attribute


currentFeature.DataRow("PointID") = pointID

'refresh the map


Map1.ResetBuffer()

End If
Else
'mouse right click
Map1.Cursor = Cursors.Default
pointmouseClick = False
End If

Case "line"
If e.Button = MouseButtons.Left Then
'left click - fill array of coordinates
'coordinate of clicked point
Dim coord As Coordinate = Map1.PixelToProj(e.Location)
If (linemouseClick) Then
'first time left click - create empty line feature
If firstClick Then
'Create a new List called lineArray.
'In List we need not define the size and also
'Here this list will store the Coordinates
'We are going to store the mouse click coordinates into this array.
Dim lineArray As New List(Of Coordinate)
'Create an instance for LineString class.
'We need to pass collection of list coordinates
Dim lineGeometry As New LineString(lineArray)
'Add the linegeometry to line feature
Dim lineFeature As IFeature = lineF.AddFeature(lineGeometry)
'add first coordinate to the line feature
lineFeature.Coordinates.Add(coord)
'set the line feature attribute
lineID = lineID + 1
lineFeature.DataRow("LineID") = lineID
firstClick = False
Else
'second or more clicks - add points to the existing feature
Dim existingFeature As IFeature = lineF.Features(lineF.Features.Count - 1)
existingFeature.Coordinates.Add(coord)
'refresh the map if line has 2 or more points
If existingFeature.Coordinates.Count >= 2 Then
lineF.InitializeVertices()
Map1.ResetBuffer()
End If
End If
End If

Teva ~ Veluppillai Page 21


Introduction to Programming with DotSpatial

Else
'right click - reset first mouse click
firstClick = True
Map1.ResetBuffer()
End If

Case "polygon"
If e.Button = MouseButtons.Left Then
'left click - fill array of coordinates
Dim coord As Coordinate = Map1.PixelToProj(e.Location)
If (polygonmouseClick) Then
'first time left click - create empty line feature
If firstClick Then
'Create a new List called polygonArray.
'Here this list will store the Coordinates
'We are going to store the mouse click coordinates into this array.
Dim polygonArray As New List(Of Coordinate)
'Create an instance for LinearRing class.
'We pass the polygon List to the constructor of this class
Dim polygonGeometry As New LinearRing(polygonArray)
'Add the polygonGeometry instance to PolygonFeature
Dim polygonFeature As IFeature = polygonF.AddFeature(polygonGeometry)
'add first coordinate to the polygon feature
polygonFeature.Coordinates.Add(coord)
'set the polygon feature attribute
polygonID = polygonID + 1
polygonFeature.DataRow("PolygonID") = polygonID
firstClick = False
Else
'second or more clicks - add points to the existing feature
Dim existingFeature As IFeature = polygonF.Features(polygonF.Features.Count - 1)
existingFeature.Coordinates.Add(coord)
'refresh the map if line has 2 or more points
If existingFeature.Coordinates.Count >= 3 Then
'refresh the map
polygonF.InitializeVertices()
Map1.ResetBuffer()
End If
End If
End If
Else
'right click - reset first mouse click
firstClick = True
Map1.Cursor = Cursors.Arrow
End If
End Select
End Sub

Teva ~ Veluppillai Page 22


Introduction to Programming with DotSpatial

C#

private void map1_MouseDown(object sender, MouseEventArgs e)


{
switch (shapeType)
{
case "Point" :
if (e.Button == MouseButtons.Left)
{
if ((pointmouseClick))
{
//This method is used to convert the screen cordinate to map coordinate
//e.location is the mouse click point on the map control
Coordinate coord = map1.PixelToProj(e.Location);

//Create a new point


//Input parameter is clicked point coordinate
DotSpatial.Topology.Point point = new DotSpatial.Topology.Point(coord);

//Add the point into the Point Feature


//assigning the point feature to IFeature because via it only we can set the attributes.
IFeature currentFeature = pointF.AddFeature(point);

//increase the point id


pointID = pointID + 1;

//set the ID attribute


currentFeature.DataRow["PointID"] = pointID;

//refresh the map


map1.ResetBuffer();
}
}

else
{
//mouse right click
map1.Cursor = Cursors.Default;
pointmouseClick = false;
}
break;

case "line":
if (e.Button == MouseButtons.Left)
{
//left click - fill array of coordinates
//coordinate of clicked point
Coordinate coord = map1.PixelToProj(e.Location);
if (linemouseClick)
{
//first time left click - create empty line feature
if (firstClick)

Teva ~ Veluppillai Page 23


Introduction to Programming with DotSpatial

{
//Create a new List called lineArray.
//This list will store the Coordinates
//We are going to store the mouse click coordinates into this array.
List<Coordinate> lineArray = new List<Coordinate>();

//Create an instance for LineString class.


//We need to pass collection of list coordinates
LineString lineGeometry = new LineString(lineArray);

//Add the linegeometry to line feature


IFeature lineFeature = lineF.AddFeature(lineGeometry);

//add first coordinate to the line feature


lineFeature.Coordinates.Add(coord);
//set the line feature attribute
lineID = lineID + 1;
lineFeature.DataRow["LineID"] = lineID;
firstClick = false;
}
else
{
//second or more clicks - add points to the existing feature
IFeature existingFeature = lineF.Features[lineF.Features.Count - 1];
existingFeature.Coordinates.Add(coord);

//refresh the map if line has 2 or more points


if (existingFeature.Coordinates.Count >= 2)
{
lineF.InitializeVertices();
map1.ResetBuffer();
}
}
}
}
else
{
//right click - reset first mouse click
firstClick = true;
map1.ResetBuffer();
}
break;

case "polygon":

if (e.Button == MouseButtons.Left)
{
//left click - fill array of coordinates
Coordinate coord = map1.PixelToProj(e.Location);

if (polygonmouseClick)
{
//first time left click - create empty line feature

Teva ~ Veluppillai Page 24


Introduction to Programming with DotSpatial

if (firstClick)
{
//Create a new List called polygonArray.

//this list will store the Coordinates


//We are going to store the mouse click coordinates into this array.

List<Coordinate> polygonArray = new List<Coordinate>();

//Create an instance for LinearRing class.


//We pass the polygon List to the constructor of this class
LinearRing polygonGeometry = new LinearRing(polygonArray);

//Add the polygonGeometry instance to PolygonFeature


IFeature polygonFeature = polygonF.AddFeature(polygonGeometry);

//add first coordinate to the polygon feature


polygonFeature.Coordinates.Add(coord);

//set the polygon feature attribute


polygonID = polygonID + 1;
polygonFeature.DataRow["PolygonID"] = polygonID;
firstClick = false;
}
else
{
//second or more clicks - add points to the existing feature
IFeature existingFeature = (IFeature)polygonF.Features[polygonF.Features.Count -
1];

existingFeature.Coordinates.Add(coord);

//refresh the map if line has 2 or more points


if (existingFeature.Coordinates.Count >= 3)
{
//refresh the map
polygonF.InitializeVertices();
map1.ResetBuffer();
}
}
}
}
else
{
//right click - reset first mouse click
firstClick = true;
}
break;
}

Teva ~ Veluppillai Page 25


Introduction to Programming with DotSpatial

Attribute table related operations

View the attribute table from the US States shapefile.

VB

Private Sub ViewAttrbuteTableToolStripMenuItem_Click(ByVal sender As System.Object,


ByVal e As System.EventArgs) Handles ViewAttrbuteTableToolStripMenuItem.Click
'Declare a datatable
Dim dt As DataTable
If Map1.Layers.Count > 0 Then
Dim stateLayer As MapPolygonLayer
stateLayer = TryCast(Map1.Layers(0), MapPolygonLayer)
If stateLayer Is Nothing Then
MessageBox.Show("The layer is not a polygon layer.")
Else
'Get the shapefile's attribute table to our datatable dt
dt = stateLayer.DataSet.DataTable
'Set the datagridview datasource from datatable dt
dgvAttributeTable.DataSource = dt
End If
Else
MessageBox.Show("Please add a layer to the map.")
End If
End Sub

C#

private void ViewAttrbuteTableToolStripMenuItem_Click(object sender, EventArgs e)


{
//Declare a datatable
System.Data.DataTable dt = null;

if (map1.Layers.Count > 0)
{
MapPolygonLayer stateLayer = default(MapPolygonLayer);

stateLayer = (MapPolygonLayer)map1.Layers[0];

if (stateLayer == null)
{
MessageBox.Show("The layer is not a polygon layer.");
}
else
{
//Get the shapefile's attribute table to our datatable dt
dt = stateLayer.DataSet.DataTable;
//Set the datagridview datasource from datatable dt
dgvAttributeTable.DataSource = dt;
}
}
else
{

Teva ~ Veluppillai Page 26


Introduction to Programming with DotSpatial

MessageBox.Show("Please add a layer to the map.");


}

5.1.1) Output of the above code

Fig. 9. View attribute table of the shapefile.

Add a new column into the attribute table. In the following example the new column name is
"PercentMales"

VB
Private Sub CreateAColumInAttributeTableToolStripMenuItem_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles CreateAColumInAttributeTableToolStripMenuItem.Click
'Declare a datatable
Dim dt As DataTable
If Map1.Layers.Count > 0 Then
Dim stateLayer As MapPolygonLayer
stateLayer = TryCast(Map1.Layers(0), MapPolygonLayer)
If stateLayer Is Nothing Then
MessageBox.Show("The layer is not a polygon layer.")
Else
'Get the shapefile's attribute table to our datatable dt
dt = stateLayer.DataSet.DataTable
'Add new column

Teva ~ Veluppillai Page 27


Introduction to Programming with DotSpatial

Dim column As New DataColumn("PercentMales")


dt.Columns.Add(column)
'calculate values
For Each row As DataRow In dt.Rows
Dim males As Double = row("males")
Dim females As Double = row("females")
Dim malesPercentage As Double = (males / (males + females)) * 100
row("PercentMales") = malesPercentage
Next
'Set the datagridview datasource from datatable dt
dgvAttributeTable.DataSource = dt
End If
Else
MessageBox.Show("Please add a layer to the map.")
End If
End Sub

C#

private void CreateAColumInAttributeTableToolStripMenuItem_Click(object sender, EventArgs e)


{
//Declare a datatable
System.Data.DataTable dt = null;

//check the layers


if (map1.Layers.Count > 0)
{
//Declare a mappolygon layer
MapPolygonLayer stateLayer = default(MapPolygonLayer);

//Assign the mappolygon layer from the map


stateLayer = map1.Layers[0] as MapPolygonLayer;

if (stateLayer == null)
{
MessageBox.Show("The layer is not a polygon layer.");
}
else
{
//Get the shapefile's attribute table to our datatable dt
dt = stateLayer.DataSet.DataTable;

//Add new column


DataColumn column = new DataColumn("PercentMales");
dt.Columns.Add(column);

//calculate values
foreach (DataRow row in dt.Rows)
{

double males = Convert.ToDouble(row["males"]);


double females = Convert.ToDouble(row["females"]);
double malesPercentage = (males / (males + females)) * 100;
row["PercentMales"] = malesPercentage;
}
//Set the datagridview datasource from datatable dt
dgvAttributeTable.DataSource = dt;
}

Teva ~ Veluppillai Page 28


Introduction to Programming with DotSpatial

}
else
{
MessageBox.Show("Please add a layer to the map.");
}

Output of the above code.

Fig. 10. Add a new column PercentMales in the attribute table.

Update the shapefile's attribute table.

VB
Private Sub SaveTheColumInShapeFileToolStripMenuItem_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles SaveTheColumInShapeFileToolStripMenuItem.Click
If Map1.Layers.Count > 0 Then
Dim stateLayer As MapPolygonLayer
stateLayer = TryCast(Map1.Layers(0), MapPolygonLayer)
If stateLayer Is Nothing Then
MessageBox.Show("The layer is not a polygon layer.")
Else
stateLayer.DataSet.Save()
End If
Else
MessageBox.Show("Please add a layer to the map.")

Teva ~ Veluppillai Page 29


Introduction to Programming with DotSpatial

End If
End Sub

C#

private void SaveTheColumInShapeFileToolStripMenuItem_Click(object sender, EventArgs e)


{
if (map1.Layers.Count > 0)
{
MapPolygonLayer stateLayer = default(MapPolygonLayer);
stateLayer = map1.Layers[0] as MapPolygonLayer;
if (stateLayer == null)
{
MessageBox.Show("The layer is not a polygon layer.");
}
else
{
stateLayer.DataSet.Save();
}
}
else
{
MessageBox.Show("Please add a layer to the map.");
}
}

Delete the attribute column from the attribute table. In the following example "PercentMales" column will
be deleted.

VB

Private Sub DeleteColumnInAttributeTableToolStripMenuItem_Click(ByVal sender As System.Object,


ByVal e As System.EventArgs) Handles DeleteColumnInAttributeTableToolStripMenuItem.Click
'Declare a datatable
Dim dt As DataTable
If Map1.Layers.Count > 0 Then
Dim stateLayer As MapPolygonLayer
stateLayer = TryCast(Map1.Layers(0), MapPolygonLayer)
If stateLayer Is Nothing Then
MessageBox.Show("The layer is not a polygon layer.")
Else
'Get the shapefile's attribute table to our datatable dt
dt = stateLayer.DataSet.DataTable
'Remove a column
dt.Columns.Remove("PercentMales")
'Set the datagridview datasource from datatable dt
dgvAttributeTable.DataSource = dt
End If
Else
MessageBox.Show("Please add a layer to the map.")
End If
End Sub

C#

private void DeleteColumnInAttributeTableToolStripMenuItem_Click(object sender, EventArgs e)

Teva ~ Veluppillai Page 30


Introduction to Programming with DotSpatial

{
//Declare a datatable
System.Data.DataTable dt = null;

if (map1.Layers.Count > 0)
{
MapPolygonLayer stateLayer = default(MapPolygonLayer);

stateLayer = map1.Layers[0] as MapPolygonLayer;

if (stateLayer == null)
{
MessageBox.Show("The layer is not a polygon layer.");
}
else
{
//Get the shapefile's attribute table to our datatable dt
dt = stateLayer.DataSet.DataTable;

//Remove a column
dt.Columns.Remove("PercentMales");

//Set the datagridview datasource from datatable dt


dgvAttributeTable.DataSource = dt;
}
}
else
{
MessageBox.Show("Please add a layer to the map.");
}

Export an attribute table to Excel datasheet.

Right click over the project on the solution explorer. On the context menu select the add reference and
add the .NET reference: Microsoft.Office.Interop.Excel

Write the following code into the ExportAttributeTableToExcelToolStripMenuItem_Click event.

VB
Private Sub ExportAttributeTableToExcelToolStripMenuItem_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles ExportAttributeTableToExcelToolStripMenuItem.Click
'Declare a datatable
Dim dt As DataTable
If Map1.Layers.Count > 0 Then
Dim stateLayer As MapPolygonLayer
stateLayer = TryCast(Map1.Layers(0), MapPolygonLayer)
If stateLayer Is Nothing Then
MessageBox.Show("The layer is not a polygon layer.")
Else
'Get the shapefile's attribute table to our datatable dt
dt = stateLayer.DataSet.DataTable
'Call the sub ExportToExcel

Teva ~ Veluppillai Page 31


Introduction to Programming with DotSpatial

'This sub procedure expects a datatable as an input


ExportToExcel(dt)
End If
Else
MessageBox.Show("Please add a layer to the map.")
End If
End Sub

C#

private void ExportAttributeTableToExcelToolStripMenuItem_Click(object sender, EventArgs e)


{
//Declare a datatable
System.Data.DataTable dt = null;

if (map1.Layers.Count > 0)
{
MapPolygonLayer stateLayer = default(MapPolygonLayer);
stateLayer = map1.Layers[0] as MapPolygonLayer;
if (stateLayer == null)
{
MessageBox.Show("The layer is not a polygon layer.");
}
else
{
//Get the shapefile's attribute table to our datatable dt
dt = stateLayer.DataSet.DataTable;
//Call the sub ExportToExcel
//This sub procedure expects a datatable as an input
ExportToExcel(dt);
}
}
else
{
MessageBox.Show("Please add a layer to the map.");
}

Write the following sub method for getting an excel datasheet output from an attribute table.

VB
''' <summary>
''' This sub method is used to create an excel worksheet from the attribute table
''' </summary>
''' <param name="objDT">attribute table as a datatable input</param>
''' <remarks> Click the COM tab of the Add Reference dialog box, and find Microsoft Excel 14 Object
Library.</remarks>
Private Sub ExportToExcel(ByVal objDT As DataTable)

Dim Excel As Object = CreateObject("Excel.Application")


Dim strFilename As String
Dim intCol, intRow As Integer
'path for storing excel datasheet
Dim strPath As String = "C:\2009 Falls\"

Teva ~ Veluppillai Page 32


Introduction to Programming with DotSpatial

If Excel Is Nothing Then


MsgBox("It appears that Excel is not installed on this machine. This operation requires MS Excel
to be installed on this machine.", MsgBoxStyle.Critical)
Return
End If
Try
With Excel
.SheetsInNewWorkbook = 1
.Workbooks.Add()
.Worksheets(1).Select()

.cells(1, 1).value = "Attribute table" 'Heading of the excel file


.cells(1, 1).EntireRow.Font.Bold = True

'Add the column names from the attribute table to excel worksheet
Dim intI As Integer = 1
For intCol = 0 To objDT.Columns.Count - 1
.cells(2, intI).value = objDT.Columns(intCol).ColumnName
.cells(2, intI).EntireRow.Font.Bold = True
intI += 1
Next

'Add the data row values from the attribute table to ecxel worksheet
intI = 3
Dim intK As Integer = 1
For intCol = 0 To objDT.Columns.Count - 1
intI = 3
For intRow = 0 To objDT.Rows.Count - 1
.Cells(intI, intK).Value = objDT.Rows(intRow).ItemArray(intCol)
intI += 1
Next
intK += 1
Next

If Mid$(strPath, strPath.Length, 1) <> "\" Then


strPath = strPath & "\"
End If

strFilename = strPath & "AttributeTable.xls"

.ActiveCell.Worksheet.SaveAs(strFilename)
End With

System.Runtime.InteropServices.Marshal.ReleaseComObject(Excel)

Excel = Nothing
MsgBox("Data's are exported to Excel Succesfully in '" & strFilename & "'",
MsgBoxStyle.Information)
Catch ex As Exception
MsgBox(ex.Message)
End Try
' The excel is created and opened for insert value. We most close this excel using this system
Dim pro() As Process = System.Diagnostics.Process.GetProcessesByName("EXCEL")
For Each i As Process In pro
i.Kill()
Next
End Sub

Teva ~ Veluppillai Page 33


Introduction to Programming with DotSpatial

C#

/// <summary>
/// This sub method is used to create an excel worksheet from the attribute table
/// </summary>
/// <param name="objDT">attribute table as a datatable input</param>
/// <remarks>Click the COM tab of the Add Reference dialog box, and find Microsoft Excel 14 Object
Library.</remarks>

private void ExportToExcel(System.Data.DataTable objDT)


{
//excel = new Excel.Application();
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();

string strFilename = null;


int intCol = 0;
int intRow = 0;
//path for storing excel datasheet
string strPath = "C:\\2009 Falls\\";

if (xlApp == null)
{
MessageBox.Show("It appears that Excel is not installed on this machine. This operation requires MS
Excel to be installed on this machine.", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
try
{
//var _with1 = Microsoft.Office.Interop.Excel.Application();
xlApp.SheetsInNewWorkbook = 1;
xlApp.Workbooks.Add();
xlApp.Worksheets[1].Select();

xlApp.Cells[1, 1].value = "Attribute table";


//Heading of the excel file
xlApp.Cells[1, 1].EntireRow.Font.Bold = true;

//Add the column names from the attribute table to excel worksheet
int intI = 1;
for (intCol = 0; intCol <= objDT.Columns.Count - 1; intCol++)
{
xlApp.Cells[2, intI].value = objDT.Columns[intCol].ColumnName;
xlApp.Cells[2, intI].EntireRow.Font.Bold = true;
intI += 1;
}

//Add the data row values from the attribute table to ecxel worksheet
intI = 3;
int intK = 1;
for (intCol = 0; intCol <= objDT.Columns.Count - 1; intCol++)
{
intI = 3;
for (intRow = 0; intRow <= objDT.Rows.Count - 1; intRow++)
{
xlApp.Cells[intI, intK].Value = objDT.Rows[intRow].ItemArray[intCol];
intI += 1;

Teva ~ Veluppillai Page 34


Introduction to Programming with DotSpatial

}
intK += 1;
}

if (strPath.Substring(strPath.Length - 1, 1) != "\\")
{
strPath = strPath + "\\";
}

strFilename = strPath + "AttributeTable.xls";

xlApp.ActiveCell.Worksheet.SaveAs(strFilename);

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);

xlApp = null;
MessageBox.Show("Data's are exported to Excel Succesfully in '" + strFilename + "'", "",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
// The excel is created and opened for insert value. We most close this excel using this system
System.Diagnostics.Process[] pro =
(System.Diagnostics.Process[])System.Diagnostics.Process.GetProcessesByName("EXCEL");
foreach (System.Diagnostics.Process i in pro)
{
i.Kill();
}
}

Printing a map in DotSpatial

Write the following code into the PrintMapToolStripMenuItem_Click event

VB

Private Sub PrintMapToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles PrintMapToolStripMenuItem.Click
Dim frm As New DotSpatial.Controls.LayoutForm
frm.MapControl = Map1
frm.Show()
End Sub

C#

private void PrintMapToolStripMenuItem_Click(object sender, EventArgs e)


{
DotSpatial.Controls.LayoutForm frm = new DotSpatial.Controls.LayoutForm();
frm.MapControl = map1;
frm.Show();
}

Teva ~ Veluppillai Page 35


Introduction to Programming with DotSpatial

Output of the above code is follows:

Teva ~ Veluppillai Page 36

You might also like