/// <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
};
}
|