C#實現(xiàn)SHP文件讀取與地圖顯示的完整教程
概述
在地理信息系統(tǒng)(GIS)開發(fā)中,SHP文件是一種常見的矢量數(shù)據(jù)格式。本文將詳細介紹如何使用C#讀取SHP文件并實現(xiàn)地圖顯示功能,包括坐標轉(zhuǎn)換、圖形渲染、平移縮放操作以及屬性表展示。
功能特點
- SHP文件讀取與解析
- 點、線、面要素的繪制
- 地圖平移與縮放功能
- 屬性數(shù)據(jù)表格展示
- 地圖元素選擇高亮
核心代碼解析

1. 文件讀取與初始化
private void 打開ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 清空現(xiàn)有數(shù)據(jù)
if (listPolygonshp != null) listPolygonshp.Clear();
if (listPointShp != null) listPointShp.Clear();
location = new PointF((this.Width - score) / 2, 25);
// 打開文件對話框
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "shp文件|*.shp";
if (ofd.ShowDialog() == DialogResult.Cancel) return;
// 讀取SHP文件
kl.OpenShpFile(ofd.FileName);
myds = kl.GetDataSet();//填充數(shù)據(jù)集
// 顯示文件頭信息
textBox1.Text = "";
textBox1.Text += "文件代碼:" + kl.GetFileCode() + "\r\n"
+ "文件長度:" + kl.GetFileLength() + "\r\n"
// ... 其他文件頭信息
}2. 坐標轉(zhuǎn)換
SHP文件使用地理坐標系,而屏幕使用像素坐標系,需要進行轉(zhuǎn)換:
private void transform(PointF[] points, int lenth)
{
float width = (float)(kl.GetXMax() - kl.GetXMin());
float height = (float)(kl.GetYMax() - kl.GetYMin());
float wh = width / height;
for (int i = 0; i < points.Length; i++)
{
points[i].X = (this.Width - lenth) / 2 +
(points[i].X - (float)kl.GetXMin()) / width * lenth * wh;
points[i].Y = lenth - (points[i].Y - (float)kl.GetYMin()) / height * lenth;
}
}3. 圖形繪制
public void DisplayShp()
{
Bitmap bp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(bp);
// 繪制點要素
foreach (PointShp p in listPointShp)
{
SolidBrush bru = new SolidBrush(Color.Green);
g.FillEllipse(bru, p.pf.X, p.pf.Y, 10, 10);
// 添加標注
g.DrawString(p.label, new Font("宋體", 9), Brushes.Black,
new PointF(p.pf.X - 25, p.pf.Y));
}
// 繪制面要素
foreach (PolygonShp ls in listPolygonshp)
{
Pen pen = new Pen(Color.Black, 2);
g.DrawPolygon(pen, ls.Points);
// 計算標注位置(面中心)
float w = 0, h = 0;
foreach (PointF pf in ls.Points)
{
w += pf.X;
h += pf.Y;
}
g.DrawString(ls.label, new Font("宋體", 9), Brushes.Green,
new PointF(w / ls.Points.Length - 25, h / ls.Points.Length));
}
pictureBox1.Image = bp;
g.Dispose();
}4. 地圖交互功能

縮放功能
private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
{
float zoomnum = e.Delta > 0 ? 1.1f : 0.9f;
foreach(PolygonShp ls in listPolygonshp)
{
zoom(ls.Points, zoomnum);
}
foreach (PointShp p in listPointShp)
{
PointF[] pos = new PointF[1] { p.pf };
zoom(pos, zoomnum);
p.pf = pos[0];
}
DisplayShp();
}
private void zoom(PointF[] points, float zoomnum)
{
for(int i = 0; i < points.Length; i++)
{
points[i].X = location.X + (points[i].X - location.X) * zoomnum;
points[i].Y = location.Y + (points[i].Y - location.Y) * zoomnum;
}
}平移功能
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if(moving)
{
foreach(PolygonShp ls in listPolygonshp)
{
for(int i = 0; i < ls.Points.Length; i++)
{
ls.Points[i].X += e.X - xStart;
ls.Points[i].Y += e.Y - yStart;
}
}
foreach (PointShp p in listPointShp)
{
p.pf.X += e.X - xStart;
p.pf.Y += e.Y - yStart;
}
xStart = e.X;
yStart = e.Y;
DisplayShp();
}
}5. 屬性表展示

public void FillProptyTable()
{
dataGridView1.DataSource = myds.Tables[0];
}使用說明
- 點擊"打開"菜單選擇SHP文件
- 查看"地圖概況"選項卡了解文件基本信息
- 在"屬性表"選項卡查看要素屬性數(shù)據(jù)
- 使用鼠標滾輪進行地圖縮放
- 按住鼠標左鍵拖動進行地圖平移
- 點擊屬性表行頭可選擇對應地圖要素
總結(jié)
本文介紹了如何使用C#實現(xiàn)SHP文件的讀取和地圖顯示功能。關鍵點包括:
- 正確處理地理坐標到屏幕坐標的轉(zhuǎn)換
- 實現(xiàn)點、線、面要素的繪制
- 添加地圖交互功能(平移、縮放)
- 展示屬性數(shù)據(jù)并與圖形要素關聯(lián)
以上就是C#實現(xiàn)SHP文件讀取與地圖顯示的完整教程的詳細內(nèi)容,更多關于C# SHP文件讀取與地圖顯示的資料請關注腳本之家其它相關文章!
相關文章
C#利用StreamReader和StreamWriter類處理文本的字符編碼使用示例
.NET Framework 中,StreamReader 和 StreamWriter 類提供了一些方法來處理字符編碼,這篇文章主要介紹了C#利用StreamReader和StreamWriter類處理文本的字符編碼使用示例,需要的朋友可以參考下2024-06-06
C#數(shù)據(jù)結(jié)構(gòu)之字符串(string)詳解
這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之字符串(string),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
快速解決owin返回json字符串多帶了雙引號"多了重string轉(zhuǎn)義字符串
下面小編就為大家?guī)硪黄焖俳鉀Qowin返回json字符串多帶了雙引號"多了重string轉(zhuǎn)義字符串。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08
c#只讀字段和常量的區(qū)別,以及靜態(tài)構(gòu)造函數(shù)的使用實例
這篇文章主要介紹了c#只讀字段和常量的區(qū)別,以及靜態(tài)構(gòu)造函數(shù)的使用實例,有需要的朋友可以參考一下2013-12-12
C# 擴展方法Extension Method在語法上的核心用法
這段SEO描述融合了"擴展方法"、"this關鍵字"和"College糖"三個關鍵詞,詳細介紹了C#中擴展方法的正確編寫規(guī)則和使用方法,強調(diào)了"this"關鍵字的重要性以及它如何讓代碼更加優(yōu)雅和易讀,感興趣的朋友跟隨小編一起看看吧2026-06-06

