SuperMap iObjects .NET 實現聚合顯示詳解
阿新 • • 發佈:2019-02-16
隨著百度、谷歌等線上地圖中出現點聚合顯示,即用少量的點或圖示來表示地圖中的所有點,讓地圖顯示更清晰明朗。有人會問了,SuperMap iObjects .NET可以實現這一視覺化嗎?回答當然是可以的,下面就跟著我一步一步的來看看具體是如何實現的吧。
一:前期準備:
資料準備:首先需要準備需要聚合的點資料,以及地圖底圖:
確定聚合演算法:本聚合顯示採用的是基於網格演算法。
二:實現步驟
1、為了方便存放在程式過程中生成的一些顯示資料,所以新建了一個記憶體資料來源”mdata”來存放資料;
DatasourceConnectionInfo datasourceConnnectionInfo = new DatasourceConnectionInfo();
datasourceConnnectionInfo.EngineType = EngineType.UDB;
datasourceConnnectionInfo.Server = ":memory:"
datasourceConnnectionInfo.Alias = "mdata";
2、由於本次使用的是基於網格的演算法,所以首先要根據地圖視窗的可視範圍新建一個地圖網格資料,將生成的網格資料新增到新建的資料來源中”mapgrid”;
生成程式碼如下:
DatasetVector datasetvectorgrid = workspace.Datasources["mdata" ].Datasets["mapgrid"] as DatasetVector;
Recordset recordset = datasetvectorgrid.GetRecordset(false, CursorType.Dynamic);
Rectangle2D maprectangle = new Rectangle2D();
maprectangle = mapcontrol.Map.ViewBounds;
double distancex = (maprectangle.Right - maprectangle.Left ) / 10;
double distancey = (maprectangle.Top - maprectangle.Bottom) / 9;
Point2D point2d = new Point2D();
rectangles = new Rectangle2D[100];
Array .Clear (rectangles ,0, rectangles .Length );
int count = 0;
For (int j = 0; j <= 8; j++)
{
for (int i = 0; i <= 9; i++)
{
point2d.X = maprectangle.Left + distancex * i;
point2d.Y = maprectangle.Bottom + distancey * j;
Rectangle2D rectangle = new Rectangle2D(point2d, distancex, distancey);
rectangles[count] = rectangle;
count++;
GeoRectangle georectangle = new GeoRectangle(rectangle, 0);
GeoStyle style = Setgeostyle();
georectangle.Style = style;
recordset.AddNew(georectangle);
recordset.Update();
}
}
3、計算每一個網格里面有多少個點,並且將將聚合點聚合在當前網格內點物件的中心,將聚合點物件新增到記憶體資料來源“point”,將聚合點數以欄位的方式儲存,對於在網格線上的點則做優先選擇處理,
實現程式碼如下:
//檢查是否包含;
private void IsCanContain()
{
//聚合點資料集;
DatasetVector datasetvectorgrid = workspace.Datasources["mdata"].Datasets["point"] as DatasetVector;
Recordset recordsetpoint = datasetvectorgrid.GetRecordset(false, CursorType.Dynamic);
//原始點資料集;
DatasetVector datasetvectorpoint = workspace.Datasources[0].Datasets["POIP"] as DatasetVector;
Recordset recordset = datasetvectorpoint.GetRecordset(false, CursorType.Static);
//臨時單個聚合物件點
DatasetVector datasetvetortpoint = workspace .Datasources ["mdata"].Datasets ["tpoint"] as DatasetVector ;
recordsetpoint.DeleteAll();
Point2D[] point2ds = new Point2D[recordset.RecordCount];
int pointitem = 0;
for (int i = 0; i < 100; i++)
{
int count = 0;
Rectangle2D rectangle = rectangles[i];
recordset.MoveFirst();
Recordset rectangleitemrecordset = datasetvetortpoint.GetRecordset(false, CursorType.Dynamic);
for (int j = 0; j < recordset.RecordCount; j++)
{
Geometry geometry = recordset.GetGeometry();
GeoPoint geopoint = geometry as GeoPoint ;
Point2D point2d = new Point2D (geopoint .X ,geopoint .Y );
if (rectangle .Contains (point2d ))
{
if (Array.IndexOf(point2ds, point2d) == -1)
{
count++;
point2ds[pointitem] = point2d;
pointitem++;
GeoPoint itemgeopoint = new GeoPoint(point2d);
rectangleitemrecordset.AddNew(itemgeopoint);
rectangleitemrecordset.Update();
}
}
recordset.MoveNext();
}
4、聚合完成後則進行顯示聚合點,對上一步驟中生成的聚合點資料集point做分段專題圖,進行2—20;20—50;50+進行分段顯示不同圖示的聚合點,並且將每個聚合點的聚合點數新增到跟中圖層進行顯示,效果如下:
5、實現選中聚合點的時候將地圖中聚合點所表示的分散點顯示出來,並且聚合點和聚合點處標籤隱藏。實現思路如下:獲取選中聚合點處的網格,通過迴圈判斷當前聚合點的分散點有哪些,將分散點的ID儲存在陣列中,通過圖層的過濾顯示將分散點顯示出來,通過以上步驟,我們的聚合顯示就完成啦,效果圖如下: