⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bufferbase.cs

📁 supermap objects 5.2空间分析缓冲技术的实现
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;
using SuperMapLib;
using AxSuperMapLib;


/******************************************************************
 * Copyright(c)  : 江苏神彩科技
 * Description   : 几何缓冲、空间查询等
 * CreateDate    : 2007-11-4
 * Creater       : 姜素芳
 * LastChangeDate: 姜素芳
 * LastChanger   : 2007-11-12
 * Version Info  : 1.0
 * ******************************************************************/

namespace SOBufferQuery
{
    [Guid("d939f3d1-36ef-4fe3-8291-6607c53fdb69")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("SOTest.BufferBase")]    

    public class BufferBase
    {
        #region 几何缓冲
        /// <summary>
        /// 
        /// </summary>
        /// <param name="geometry">待缓冲的几何</param>
        /// <param name="distance">缓冲度(半径)</param>
        /// <returns>缓冲后的几何</returns>
        soGeometry Buffer(soGeometry geometry, double distance)
        {
            soGeoRegion objGeoRegion = null;

            //点、线、面缓冲处理
            if (geometry.Type == seGeometryType.scgPoint)
            {
                soGeoPoint tmpPoint = (soGeoPoint)geometry;
                objGeoRegion = tmpPoint.Buffer(distance, 60);

                Marshal.ReleaseComObject(tmpPoint);
                tmpPoint = null;
            }
            else if (geometry.Type == seGeometryType.scgRegion)
            {
                soGeoRegion tmpGeoRegion = (soGeoRegion)geometry;
                objGeoRegion = tmpGeoRegion.Buffer(distance, 60);

                Marshal.ReleaseComObject(tmpGeoRegion);
                tmpGeoRegion = null;
            }
            else if (geometry.Type == seGeometryType.scgLine)
            {
                soGeoLine tmpGeoLine = (soGeoLine)geometry;
                objGeoRegion = tmpGeoLine.Buffer(distance, 60);

                Marshal.ReleaseComObject(tmpGeoLine);
                tmpGeoLine = null;
            }

            return (soGeometry)objGeoRegion;
        }
        #endregion

        #region 记录对应几何缓冲
        /// <summary>
        /// 将指定记录对应几何进行缓冲
        /// </summary>
        /// <param name="recordset"></param>
        /// <param name="distance"></param>
        /// <returns>缓冲后的几何</returns>static
        public soGeometry CreatBuffer(soRecordset recordset, double distance)
        {
            soGeometry objGeometry = recordset.GetGeometry();

            return Buffer(objGeometry, distance);
        }
        #endregion

        #region 空间包含查询
        /// <summary>
        /// 将给定的几何进行缓冲,然后查询指定图层里包含在该缓冲区内的要素,并高亮显示
        /// </summary>
        /// <param name="superMap">地图</param>
        /// <param name="layer">待查询的图层</param>
        /// <param name="geometry">缓冲后作为空间查询区域的几何</param>static
        public void SpatialQuery(AxSuperMap superMap, soLayer layer, soGeometry geometry)
        {
            //风格变量
            soStyle objStyle = new soStyleClass();

            #region 设置缓冲区风格
            objStyle.BrushStyle = 2;
            objStyle.BrushBackTransparent = true;
            objStyle.PenColor = (uint)ColorTranslator.ToOle(Color.Purple);
            objStyle.PenWidth = 1;
            #endregion

            //得到缓冲后的几何
            soGeometry objGeometry = Buffer(geometry, 50);
            //转为缓冲区域作为空间查询区域
            soGeoRegion objGeoRegion = (soGeoRegion)objGeometry;
            //地图跟踪层并清除原有跟踪
            soTrackingLayer objTrackLayer = superMap.TrackingLayer;
            objTrackLayer.ClearEvents();

            //在跟踪层上绘出缓冲区域
            if (objGeoRegion != null)
            {
                objTrackLayer.AddEvent((soGeometry)objGeoRegion, objStyle, "");
                objTrackLayer.Refresh();
            }

            //图层数据集
            soDataset objDataset = layer.Dataset;
            //将图层数据集转为矢量
            soDatasetVector objDatasetVector = (soDatasetVector)objDataset;
            //查询指定图层包含在缓冲区域内的要素集
            soRecordset objRsQuery = objDatasetVector.QueryEx(objGeometry, seSpatialQueryMode.scsContaining, "");

            //定义选中几何
            soGeometry objSldGeometry = null;
            #region 设置选中几何风格
            objStyle.BrushBackTransparent = true;
            objStyle.PenColor = (uint)ColorTranslator.ToOle(Color.Blue);
            objStyle.PenWidth = 5;
            objStyle.BrushColor = (uint)ColorTranslator.ToOle(Color.DarkRed);
            objStyle.BrushStyle = 2;
            objStyle.SymbolSize = 40;
            #endregion

            #region 高亮显示查询得到的要素集
            if (objRsQuery != null)
            {
                objRsQuery.MoveFirst();

                for (int i = 1; i <= objRsQuery.RecordCount; i++)
                {
                    objSldGeometry = objRsQuery.GetGeometry();
                    objRsQuery.MoveNext();
                    objTrackLayer.AddEvent(objSldGeometry, objStyle, "");
                }
            }
            #endregion

            //地图刷新
            superMap.Refresh();

            #region 释放COM对象
            Marshal.ReleaseComObject(objGeometry);
            objGeometry = null;
            Marshal.ReleaseComObject(objGeoRegion);
            objGeoRegion = null;
            Marshal.ReleaseComObject(objDatasetVector);
            objDatasetVector = null;
            Marshal.ReleaseComObject(objDataset);
            objDataset = null;
            Marshal.ReleaseComObject(objRsQuery);
            objRsQuery = null;
            Marshal.ReleaseComObject(objStyle);
            objStyle = null;
            Marshal.ReleaseComObject(objTrackLayer);
            objTrackLayer = null;
            #endregion
        }
        #endregion

        #region 绘制通过给定两点的圆区域(采用了中间点缓冲的方法)
        soGeometry GetCenterPointBuffer(double x0, double y0, double x1, double y1)
        {
            double x, y, tmpx, tmpy, width, height;

            #region 确定给定两点间的水平距离及垂直距离
            width = Math.Abs(x0 - x1);
            height = Math.Abs(y0 - y1);
            #endregion

            #region 根据x值交换两点
            if (x0 > x1)
            {
                tmpx = x0;
                x0 = x1;
                x1 = tmpx;

                tmpy = y0;
                y0 = y1;
                y1 = tmpy;
            }
            #endregion

            #region 确定给定两点连线的中心点坐标并转为几何点
            //中心点x值
            x = x0 + width / 2;
            //中心点y值
            if (y0 > y1)
                y = y0 - height / 2;
            else
                y = y0 + height / 2;

            soGeoPoint geoPoint = new soGeoPoint();
            geoPoint.x = x;
            geoPoint.y = y;
            #endregion

            //确定缓冲半径
            double radius = Math.Sqrt(width * width + height * height) / 2;

            //返回缓冲几何
            return Buffer((soGeometry)geoPoint, radius);
        }
        #endregion

        #region 多次空间查询
        /// <summary>
        /// 根据给定的两个点生成一个包含它们的圆,然后查询出第一个图层中与这个圆相交的记录集(2次相交),再查询出第二个图层中包含在这些记录的缓冲域内的记录集,最后地图上高亮度显示查询出来的第一、二图层中的记录集
        /// </summary>
        /// <param name="superMap">地图</param>
        /// <param name="firstLayer">第一个图层(如河流图层)</param>
        /// <param name="secondLayer">第二个图层(如工厂图层)</param>
        /// <param name="x0">第一个经纬度点的x值</param>
        /// <param name="y0">第一个经纬度点的y值</param>
        /// <param name="x1">第二个经纬度点的x值</param>
        /// <param name="y1">第二个经纬度点的y值</param>
        /// <param name="distance"></param>
        public void BufferSpatialQuery(AxSuperMap superMap, soLayer firstLayer, soLayer secondLayer, double x0, double y0, double x1, double y1, double distance)
        {
            //绘制通过给定两点的圆区域
            soGeometry objFGeometry = GetCenterPointBuffer(x0, y0, x1, y1);

            //地图跟踪层,初始清空
            soTrackingLayer objTrackLayer = superMap.TrackingLayer;
            objTrackLayer.ClearEvents();

            //第一图层查询集的显示风格
            soStyle objFStyle = new soStyleClass();
            objFStyle.BrushStyle = 2;
            objFStyle.BrushBackTransparent = true;
            objFStyle.PenColor = (uint)ColorTranslator.ToOle(Color.Blue);
            objFStyle.PenWidth = 5;
            objFStyle.BrushColor = (uint)ColorTranslator.ToOle(Color.DeepPink);
            //objTrackLayer.AddEvent(objFGeometry, objFStyle, "");

            //第二图层查询集的显示风格
            soStyle objSStyle = new soStyleClass();
            objSStyle.BrushBackTransparent = true;
            objSStyle.PenColor = (uint)ColorTranslator.ToOle(Color.Red);
            objSStyle.PenWidth = 5;
            objSStyle.BrushColor = (uint)ColorTranslator.ToOle(Color.DarkRed);            

            //第一、二图层的矢量数据集
            soDatasetVector objFDatasetVector = (soDatasetVector)firstLayer.Dataset;
            soDatasetVector objSDatasetVector = (soDatasetVector)secondLayer.Dataset;

            //查询第一图层与圆区域相交的记录集
            soRecordset objFRsQuery = objFDatasetVector.QueryEx(objFGeometry, seSpatialQueryMode.scsAreaIntersect, "");
                        
            objFRsQuery.MoveFirst();
            for (int i = 1; i <= objFRsQuery.RecordCount; i++)
            {
                //二次查询出第一图层与圆区域相交的精确几何
                soGeometry objSGeometry = objFGeometry.SpatialOperator.Intersection(objFRsQuery.GetGeometry());
                //高亮度显示第一图层查询记录
                objFStyle.PenColor = (uint)ColorTranslator.ToOle(Color.DarkViolet);
                objTrackLayer.AddEvent(objSGeometry, objFStyle, "");

                //缓冲二次相交记录
                soGeometry objSGeometryBuffer = Buffer(objSGeometry, distance);
                //高亮显示
                //objFStyle.PenColor = (uint)ColorTranslator.ToOle(Color.YellowGreen);
                //objTrackLayer.AddEvent(objSGeometryBuffer, objFStyle, "");

                //二次查询记录缓冲后与圆相交的部分,记为*
                soGeometry objTGeometry = objFGeometry.SpatialOperator.Intersection(objSGeometryBuffer);
                //二次查询集缓冲区的显示风格
                soStyle objTStyle = new soStyleClass();
                objTStyle.BrushStyle = 5;
                objTStyle.BrushBackTransparent = true;
                objTStyle.PenColor = (uint)ColorTranslator.ToOle(Color.MediumSpringGreen);
                objTStyle.PenWidth = 5;
                objTStyle.BrushColor = (uint)ColorTranslator.ToOle(Color.DeepSkyBlue);
                //高亮显示
                //objTrackLayer.AddEvent(objTGeometry, objTStyle, "");

                //查询第二图层中包含在*内的记录集,并高亮显示
                soRecordset objSRsQuery = objSDatasetVector.QueryEx(objTGeometry, seSpatialQueryMode.scsContaining, "");
                objSRsQuery.MoveFirst();
                for (int j = 1; j <= objSRsQuery.RecordCount; j++)
                {
                    soGeometry objGeometry = objSRsQuery.GetGeometry();
                    objTrackLayer.AddEvent(objGeometry, objSStyle, "");

                    objSRsQuery.MoveNext();
                }

                objFRsQuery.MoveNext();
            }

            //刷新地图
            superMap.Refresh();
        }
        #endregion
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -