1. 程式人生 > >SuperMap iObjects .NET 實現聚合顯示詳解

SuperMap iObjects .NET 實現聚合顯示詳解

隨著百度、谷歌等線上地圖中出現點聚合顯示,即用少量的點或圖示來表示地圖中的所有點,讓地圖顯示更清晰明朗。有人會問了,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儲存在陣列中,通過圖層的過濾顯示將分散點顯示出來,通過以上步驟,我們的聚合顯示就完成啦,效果圖如下:
這裡寫圖片描述