绘制省市区县乡镇街道区划

回到首页  往前  往后

该范例程序会演示如何绘制全国省、市、区县、乡镇街道行政区划边界。

1、支持对行政区划进行边界裁剪显示

2、支持绘制行政区划的所有子区划,例如:绘制北京市东城区的所有乡镇街道规划

3、支持全国乡镇街道区划绘制

注意1:太乐地图.NET控件 名称统一命名为:MapControl

注意2:该范例程序涉需要全国行政区划矢量数据库支持,范例程序中自带最新版本数据库:BaiduData.db,您也可以点我下载

注意3:该范例程序涉及到1个地图事件:DrawPolygon

范例运行后界面如下图所示:

绘制全国行政区划

源码  

       /// <summary>

       /// 选择行政区划后的名称的填充

       /// </summary>

       /// <param name="sender"></param>

       /// <param name="e"></param>

       private void SelectPczCmd_Executed(object sender, EventArgs e)

       {

           if (sender == null)

               return;

 

           var cbx = sender as ComboBox;

           if (cbx == null) return;

           var selectedItem = cbx.SelectedItem;

           if (selectedItem == null) return;

 

           if (sender == comboBox1)

           {

               // 选择省或直辖市或特别行政区

               comboBox2.Items.Clear();

               comboBox3.Items.Clear();

               comboBox5.Items.Clear();

 

               if (selectedItem is Province)

               {

                   var province = selectedItem as Province;

                   // 填充市名称

                   FillCities(comboBox2, province);

               }

               if (selectedItem is City)

               {

                   var city = selectedItem as City;

                   // 填充区县名称

                   FillZones(comboBox2, city);

               }

           }

           if (sender == comboBox2)

           {

               // 选择市

               comboBox3.Items.Clear();

               comboBox5.Items.Clear();

 

               if (selectedItem is City)

               {

                   var city = selectedItem as City;

                   // 填充区县名称

                   FillZones(comboBox3, city);

               }

               if (selectedItem is Zone)

               {

                   var zone = selectedItem as Zone;

                   // 填充乡镇名称

                   FillTowns(comboBox3, zone);

               }

           }

           if (sender == comboBox3)

           {

               // 选择区县

               comboBox5.Items.Clear();

               if (selectedItem is Zone)

               {

                   var zone = selectedItem as Zone;

                   // 填充乡镇名称

                   FillTowns(comboBox5, zone);

               }

           }

 

           DrawProvinceCityZoneTown(cbx);

       }

 

       /// <summary>

       /// 填充省、直辖市和特别行政区名称

       /// </summary>

       private void FillProvices()

       {

           var provinces = BaiduDBHelper.GetProvinces(); // 获取省数据

           var cities = BaiduDBHelper.GetMunicipalities(); // 获取直辖市或特别行政区数据

           comboBox1.Items.Clear();

           comboBox1.Items.Add(new Province { Name = "" });

           foreach (var city in cities)

           {

               comboBox1.Items.Add(city);

           }

           foreach (var province in provinces)

           {

               comboBox1.Items.Add(province);

           }

           comboBox1.DisplayMember = "Name";

       }

 

       /// <summary>

       /// 填充市名称

       /// </summary>

       /// <param name="combo"></param>

       /// <param name="province"></param>

       private void FillCities(ComboBox combo, Province province)

       {

           var cities = BaiduDBHelper.GetCities(province); // 获取市数据

           combo.Items.Clear();

           combo.Items.Add(new City { Name = "" });

           foreach (var city in cities)

           {

               combo.Items.Add(city);

           }

           combo.DisplayMember = "Name";

       }

 

       /// <summary>

       /// 填充区县名称

       /// </summary>

       /// <param name="combo"></param>

       /// <param name="city"></param>

       private void FillZones(ComboBox combo, City city)

       {

           var zones = BaiduDBHelper.GetZones(city); // 获取区县数据

           combo.Items.Clear();

           combo.Items.Add(new Zone { Name = "" });

           foreach (var zone in zones)

           {

               combo.Items.Add(zone);

           }

           combo.DisplayMember = "Name";

       }

 

       /// <summary>

       /// 填充乡镇名称

       /// </summary>

       /// <param name="combo"></param>

       /// <param name="city"></param>

       private void FillTowns(ComboBox combo, Zone zone)

       {

           var towns = BaiduDBHelper.GetTowns(zone); // 获取乡镇数据

           combo.Items.Clear();

           combo.Items.Add(new Town { Name = "" });

           foreach (var town in towns)

           {

               combo.Items.Add(town);

           }

           combo.DisplayMember = "Name";

       }

 

       /// <summary>

       /// 绘制行政区划

       /// </summary>

       private void DrawProvinceCityZoneTown(ComboBox cbx)

       {

           if (cbx == null)

               return;

           Object selectedItem = cbx.SelectedItem;

           if (selectedItem == null)

               return;

           var pczt = selectedItem as AdministrativeDivision;

           if (string.IsNullOrEmpty(pczt.Name)) return;

 

           _graphicLayer.Clear();

           MapRoute route = pczt.Boundaries;

           String name = pczt.Name;

           string area = pczt.Area;

           string length = pczt.Length;

 

           var g = new AZMapPolygon(route.Points, name);

           {

               // 不同的行政区划,不同的绘制样式

               if (pczt is Province)

               {

                   g.Stroke = new Pen(Color.FromArgb(200, Color.Blue)) // 边线颜色

                   {

                       Width = 3, // 粗细

                       DashStyle = DashStyle.Dash // 样式(这里使用 实心线 的样式)

                   };

                   g.Fill = new SolidBrush(Color.FromArgb(20, Color.Blue)); // 填充色

               }

               if (pczt is City)

               {

                   g.Stroke = new Pen(Color.FromArgb(200, Color.Red)) // 边线颜色

                   {

                       Width = 3, // 粗细

                       DashStyle = DashStyle.DashDot // 样式(这里使用 实心线 的样式)

                   };

                   g.Fill = new SolidBrush(Color.FromArgb(20, Color.Red)); // 填充色

               }

               if (pczt is Zone)

               {

                   g.Stroke = new Pen(Color.FromArgb(200, Color.Yellow)) // 边线颜色

                   {

                       Width = 3, // 粗细

                       DashStyle = DashStyle.Solid // 样式(这里使用 实心线 的样式)

                   };

                   g.Fill = new SolidBrush(Color.FromArgb(20, Color.Yellow)); // 填充色

               }

               if (pczt is Town)

               {

                   g.Stroke = new Pen(Color.FromArgb(200, Color.Green)) // 边线颜色

                   {

                       Width = 3, // 粗细

                       DashStyle = DashStyle.Solid // 样式(这里使用 实心线 的样式)

                   };

                   g.Fill = new SolidBrush(Color.FromArgb(20, Color.Green)); // 填充色

               }

               g.Title = name; // 显示区划名称

               g.IsHitTestVisible = true;

               g.EnableRightClick = true;

 

               // 绘制鼠标提示

               if (g.To != null)

               {

                   var marker = new AZMapMarkerEllipse(g.To.Value)

                   {

                       ToolTipText = String.Format("{2}\r\n面积:{0}平方千米\r\n长度:{1}千米", area, length, name),

                       ToolTipMode = MarkerTooltipMode.OnMouseOver

                   };

                   g.ToolTipMarker = marker;

               }

               g.ToolTipPosition = MapRouteToolTipPosition.LastPoint;

           }

           _graphicLayer.Polygons.Add(g);

 

           MapControl.ZoomAndCenterRoute(g);

 

           // 设置要裁剪的区域

           MapControl.ClipBoundry = route.Points;

           MapControl.ClipBoundryKey = pczt.Id;

           if (MapControl.IsClip)

           {

               MapControl.ReloadMap();

           }

           // 设置选择的区划用于绘制子区划

           _currentPCZT = pczt;

       }

 

       /// <summary>

       /// 边界裁剪

       /// </summary>

       /// <param name="sender"></param>

       /// <param name="e"></param>

       private void checkBox3_CheckedChanged(object sender, EventArgs e)

       {

           MapControl.IsClip = checkBox3.Checked;

           if (!checkBox3.Checked && MapControl.ClipBoundry == null) return;

 

           if (checkBox3.Checked && MapControl.ClipBoundry == null)

           {

               MessageBox.Show(this, "请先选择行政区划");

               return;

           }

         

           // 设置裁剪的后的背景色

           MapControl.EmptyTileColor = Color.WhiteSmoke;

           MapControl.ReloadMap();

       }

 

       /// <summary>

       /// 绘制子区划

       /// </summary>

       /// <param name="sender"></param>

       /// <param name="e"></param>

       private void checkBox4_CheckedChanged(object sender, EventArgs e)

       {

           _graphicLayer.Clear();

           if (checkBox4.Checked)

           {

               if (_currentPCZT is Province)

               {

                   var province = _currentPCZT as Province;

                   var cities = BaiduDBHelper.GetCities(province);

                   foreach (var city in cities)

                   {

                       _graphicLayer.Polygons.Add(BuildPolygon(city.Boundaries.Points, city.Name));

                   }

               }

               else if (_currentPCZT is City)

               {

                   var city = _currentPCZT as City;

                   var zones = BaiduDBHelper.GetZones(city);

                   foreach (var zone in zones)

                   {

                       _graphicLayer.Polygons.Add(BuildPolygon(zone.Boundaries.Points, zone.Name));

                   }

               }

               else if (_currentPCZT is Zone)

               {

                   var zone = _currentPCZT as Zone;

                   var towns = BaiduDBHelper.GetTowns(zone);

                   foreach (var town in towns)

                   {

                       _graphicLayer.Polygons.Add(BuildPolygon(town.Boundaries.Points, town.Name));

                   }

               }

           }

       }

 

       /// <summary>

       /// 构建一个随机色的多边形

       /// </summary>

       /// <param name="points"></param>

       /// <param name="name"></param>

       /// <returns></returns>

       private AZMapPolygon BuildPolygon(List<PointLatLng> points, string name)

       {

           Random ran = new Random(Guid.NewGuid().GetHashCode());

         

           int R, G, B;

           double Y;

           bool result;

 

           do

           {

               R = ran.Next(0, 255);

               G = ran.Next(0, 255);

               B = ran.Next(0, 255);

 

               //Y值计算公式

               Y = 0.299 * R + 0.587 * G + 0.114 * B;

 

               result = Y >= 10 && Y <= 50;

           } while (!result);

           Color color = Color.FromArgb(180, R, G, B);

 

           var stroke = new Pen(color)

           {

               Width = 1,

               DashStyle = System.Drawing.Drawing2D.DashStyle.Solid

           };

           var fill = new SolidBrush(color);

           return new AZMapPolygon(points, name)

           {

               Stroke = stroke,

               Fill = fill,

               Title = name,

               IsHitTestVisible = false,

               EnableRightClick = false,

               EnableDoubleClick = false,

               EnableEdit = false

           };

       }