You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:25:24