Delphi示例:SQL Server Spatial获取指定多边形内的多边形列表
SQL查询实现
假设你的多边形表名为PolygonTable,空间数据字段为Geom(类型为SQL Server的geometry),记录索引字段为RecordIndex。要查询所有位于RecordIndex=1对应的多边形内部的多边形记录,可以通过以下SQL语句实现:
SELECT pt.* FROM PolygonTable pt JOIN PolygonTable tp ON tp.RecordIndex = 1 WHERE tp.Geom.STContains(pt.Geom) = 1
说明
- 通过自连接定位到
RecordIndex=1的目标多边形(表别名tp) - 使用SQL Server空间函数
STContains判断目标多边形是否包含当前行的多边形(表别名pt),返回值为1时表示包含,0则不包含
如果需要更清晰的结构,也可以用CTE(公共表表达式)写法:
WITH TargetPolygon AS ( SELECT Geom FROM PolygonTable WHERE RecordIndex = 1 ) SELECT pt.* FROM PolygonTable pt CROSS JOIN TargetPolygon tp WHERE tp.Geom.STContains(pt.Geom) = 1
Delphi代码示例
以下是基于ADO组件的Delphi代码示例,用于执行上述查询并获取结果:
unit PolygonQueryUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ADODB, DB, Grids, DBGrids; type TForm1 = class(TForm) ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; DBGrid1: TDBGrid; DataSource1: TDataSource; Button1: TButton; procedure Button1Click(Sender: TObject); private procedure GetPolygonsInsideTarget(const ARecordIndex: Integer; ADataSet: TADOQuery); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.GetPolygonsInsideTarget(const ARecordIndex: Integer; ADataSet: TADOQuery); var SQLStr: string; begin if not Assigned(ADataSet) then Exit; if not ADataSet.Connection.Connected then Exit; // 构造参数化SQL语句,避免SQL注入风险 SQLStr := 'SELECT pt.* ' + 'FROM PolygonTable pt ' + 'JOIN PolygonTable tp ON tp.RecordIndex = :TargetIndex ' + 'WHERE tp.Geom.STContains(pt.Geom) = 1'; ADataSet.Close; ADataSet.SQL.Clear; ADataSet.SQL.Add(SQLStr); ADataSet.Parameters.ParamByName('TargetIndex').AsInteger := ARecordIndex; try ADataSet.Open; except on E: Exception do raise Exception.CreateFmt('查询多边形数据失败:%s', [E.Message]); end; end; procedure TForm1.Button1Click(Sender: TObject); begin // 查询RecordIndex=1对应的多边形内部的所有记录 GetPolygonsInsideTarget(1, ADOQuery1); end; end.
说明
- 确保
ADOConnection1已正确配置SQL Server连接字符串 - 使用参数化查询绑定目标索引,避免SQL注入漏洞
- 查询结果可通过
TADOQuery绑定到TDBGrid等控件展示
内容的提问来源于stack exchange,提问作者Franz
相关产品推荐
相关产品推荐

