📄 bufferbase.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 + -