?? 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 + -