ArcGIS API for Silverlight 地圖中解決點眾多的簇解決方法
1、通用類
#region 多點的簇顯示
public class SumClusterer : GraphicsClusterer
{
public SumClusterer()
{
MinimumColor = Colors.Red;
MaximumColor = Colors.Yellow;
SymbolScale = 2;
base.Radius = 100;
}
public string AggregateColumn { get; set; }
public double SymbolScale { get; set; }
public Color MinimumColor { get; set; }
public Color MaximumColor { get; set; }
protected override Graphic OnCreateGraphic(GraphicCollection cluster, MapPoint point, int maxClusterCount)
{
if (cluster.Count == 1) return cluster[0];
Graphic graphic = null;
double sum = 0;
foreach (Graphic g in cluster)
{
if (g.Attributes.ContainsKey(AggregateColumn))
{
try
{
sum += Convert.ToDouble(g.Attributes[AggregateColumn]);
}
catch { }
}
}
double size = (sum + 450) / 30;
size = (Math.Log(sum * SymbolScale / 10) * 10 + 20);
if (size < 12) size = 12;
graphic = new Graphic() { Symbol = new ClusterSymbol() { Size = size }, Geometry = point };
graphic.Attributes.Add("Count", sum);
graphic.Attributes.Add("Size", size);
graphic.Attributes.Add("Color", InterpolateColor(size - 12, 100));
return graphic;
}
private static Brush InterpolateColor(double value, double max)
{
value = (int)Math.Round(value * 255.0 / max);
if (value > 255) value = 255;
else if (value < 0) value = 0;
return new SolidColorBrush(Color.FromArgb(127, 255, (byte)value, 0));
}
}
internal class ClusterSymbol : ESRI.ArcGIS.Client.Symbols.MarkerSymbol
{
public ClusterSymbol()
{
string template = @"
<ControlTemplate xmlns=""http://schemas.microsoft.com/client/2007"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" >
<Grid IsHitTestVisible=""False"">
<Ellipse
Fill=""{Binding Attributes[Color]}""
Width=""{Binding Attributes[Size]}""
Height=""{Binding Attributes[Size]}"" />
<Grid HorizontalAlignment=""Center"" VerticalAlignment=""Center"">
<TextBlock
Text=""{Binding Attributes[Count]}""
FontSize=""9"" Margin=""1,1,0,0"" FontWeight=""Bold""
Foreground=""#99000000"" />
<TextBlock
Text=""{Binding Attributes[Count]}""
FontSize=""9"" Margin=""0,0,1,1"" FontWeight=""Bold""
Foreground=""White"" />
</Grid>
</Grid>
</ControlTemplate>";
this.ControlTemplate = System.Windows.Markup.XamlReader.Load(template) as ControlTemplate;
}
public double Size { get; set; }
public override double OffsetX
{
get
{
return Size / 2;
}
set
{
throw new NotSupportedException();
}
}
public override double OffsetY
{
get
{
return Size / 2;
}
set
{
throw new NotSupportedException();
}
}
}
#endregion
void client_GetMonitorInfoCompleted(object sender, GetMonitorInfoCompletedEventArgs e)
{
ObservableCollection<MonitorInfo> list = e.Result;
ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator();
GraphicsLayer graphicsLayer = myMap.Layers["MyGraphicsLayer"] as GraphicsLayer;
//每次載入時先清空地圖上資料
graphicsLayer.ClearGraphics();
Uri uri = null;
Graphic graphic = null;
foreach (MonitorInfo item in list)
{
if (!string.IsNullOrEmpty(item.Latitute.ToString()) && !string.IsNullOrEmpty(item.Longitute.ToString()))
{
//有座標值時,將該監測點新增到地圖上去
graphic = new Graphic()
{
Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim()), double.Parse(item.Longitute.ToString().Trim()))),
Symbol = LayoutRoot.Resources["DefaultMarkerSymbol"] as Symbol,
};
//手動為graphic新增屬性(需要用到的和資料庫表之間的關聯)
graphic.Attributes["Id"] = item.ID;
graphic.Attributes["Name"] = item.Name;
graphic.Attributes["AreaID"] = item.CountyAreaID;
for (int i = 0; i < areaId.Length; i++)
{
if (areaId[i] == item.ID.ToString())
{
switch (seedlingType[i])
{
case "1":
uri = new Uri("Images/red.png", UriKind.Relative);
break;
case "2":
uri = new Uri("Images/yellow.png", UriKind.Relative);
break;
case "3":
uri = new Uri("Images/green.png", UriKind.Relative);
break;
case "4":
uri = new Uri("Images/red.png", UriKind.Relative);
break;
default:
break;
}
}
}
BitmapImage image = new BitmapImage(uri);
//定義Symbol樣式,包括填充顏色
Symbol symbol = new PictureMarkerSymbol()
{
OffsetX = 8,
OffsetY = 8,
Source = image
};
graphic.Symbol = symbol;
//將該Graphics新增到GraphicsLayer中去
graphicsLayer.Graphics.Add(graphic);
//為眾多的監測點提供簇聚合功能
graphicsLayer.Clusterer = new SumClusterer() { AggregateColumn = "AreaID", SymbolScale = 0.008 };
//左鍵選單
graphic.MouseLeftButtonDown += new MouseButtonEventHandler(Feature_MouseLeftButtonDown);
graphic.MouseLeftButtonUp += new MouseButtonEventHandler(Feature_MouseLeftButtonUp);
//右鍵選單
graphic.MouseRightButtonDown += new MouseButtonEventHandler(Feature_MouseRightButtonDown);
graphic.MouseRightButtonUp += new MouseButtonEventHandler(Feature_MouseRightButtonUp);
}
else
{
//不做任何處理,不新增任何點資訊
}
//座標點聚焦
ESRI.ArcGIS.Client.Geometry.Envelope selectedFeatureExtent = graphic.Geometry.Extent; //最後一個點的位置
double expandPercentage = 30;
double widthExpand = selectedFeatureExtent.Width * (expandPercentage / 100);
double heightExpand = selectedFeatureExtent.Height * (expandPercentage / 100);
ESRI.ArcGIS.Client.Geometry.Envelope displayExtent = new ESRI.ArcGIS.Client.Geometry.Envelope(
selectedFeatureExtent.XMin - (widthExpand / 2),
selectedFeatureExtent.YMin - (heightExpand / 2),
selectedFeatureExtent.XMax + (widthExpand / 2),
selectedFeatureExtent.YMax + (heightExpand / 2));
myMap.ZoomTo(displayExtent);
}
}
相關文章
- 百度地圖,您所使用的地圖JS API版本過低,解決方法地圖JSAPI
- 圖解Eclipse中找不到Server選項的解決方法圖解EclipseServer
- win7系統下silverlight部署提示2104錯誤的解決方法Win7
- 高德地圖API中折線polyline不能跨越180度經度線的解決方案地圖API
- ArcGis api配合vue開發入門系列(一)引入arcgis api以及載入地圖APIVue地圖
- ArcGIS API for JavaScript根據兩個點座標在地圖上畫線APIJavaScript地圖
- 從圖片提取文字的終極解決方法 ——【通用文字識別 API】API
- 絕地求生崩潰怎麼解決win10_win10絕地求生崩潰的解決方法Win10
- 解決Vue中”This dependency was not found”的方法Vue
- hash解決衝突的方法優缺點
- TabError的解決方法Error
- win10系統平板模式桌面圖示沒了的解決解決方法Win10模式
- 解決ajax跨域問題的多種方法跨域
- ArcGIS地圖投影與座標系轉換的方法地圖
- javaweb中中文亂碼解決方法總結之response和request解決方法JavaWeb
- dns劫持怎麼解決 dns劫持的解決方法DNS
- Fedora 20下解決使用者不在sudoers檔案中的解決方法
- 公眾號 - 解決所有測試中的CORS問題CORS
- 圖紙管理、圖文件管理安全保障解決方法
- Hadoop中Namenode單點故障的解決方案Hadoop
- CSDN上傳中斷解決方法
- Linux中產生zombie的原因詳解及解決方法!Linux
- MYSQL中 TYPE=MyISAM 錯誤的解決方法MySql
- pyecharts地圖功能,並解決顯示不全或只顯示南海諸島問題解決Echarts地圖
- Logo(圖片)作為報表水印的解決方法Go
- 過多if - else 的問題, 以及策略模式 + 反射解決方法模式反射
- java中亂碼問題解決方法Java
- EXE病毒解決方法
- No Task Available解決方法AI
- 【IDL】IDL中亂碼問題的解決方法
- JS中toFixed()方法的問題及解決方案JS
- 遇到問題的解決方法
- wegame閃退怎麼解決 wegame閃退打不開多種解決方法介紹GAM
- IDC:2019年中國高精度地圖解決方案市場份額地圖圖解
- 多專案管理中的難題及解決方案專案管理
- Windows10系統下絕地求生卡頓的解決方法Windows
- 不偏移的天地圖地圖服務-ArcGIS版地圖
- python解決反爬蟲方法的優缺點對比Python爬蟲
- Dynamics CRM 圖表超出最大記錄限制的解決方法