在SQL中创建多边形

在SQL中创建多边形,sql,sql-server,Sql,Sql Server,仍在学习SQL。我需要根据插入到表中的长度和宽度创建两个矩形。然后我运行一个简单的存储过程来更新表 Create Table Field ( FieldId INT IDENTITY(1,1) FieldLength INT NOT NULL, FieldWidth INT NOT NULL, FieldHalfLength INT NULL, LeftHalfField GEOMETRY NULL, RightHalfField GEOMETRY NULL );

仍在学习SQL。我需要根据插入到表中的长度和宽度创建两个矩形。然后我运行一个简单的存储过程来更新表

  Create Table Field (
  FieldId INT IDENTITY(1,1)
  FieldLength INT NOT NULL,
  FieldWidth INT NOT NULL,
  FieldHalfLength INT NULL,
  LeftHalfField GEOMETRY NULL,
  RightHalfField GEOMETRY NULL
  );

  INSERT INTO Field (FieldLength, FieldWidth) VALUES (4134, 2678);
存储过程

  Update Field
  Set 
  FieldHalfLength = (FieldLength/2),
  LeftHalfField = Polygon(0 0, FieldHalfLength 0, FieldHalfLength FieldWidth, 0 FieldWidth, 0 0),
  RightHalfField = Polygon(FieldHalfLength 0, FieldLength 0, FieldLength FieldWidth, FieldHalfLength 
  FieldWidth, FieldHalfLength 0);

我不知道如何为LeftHalfField和RightHalfField创建多边形。如果这个问题有简单的解决方法,请告诉我。如果我需要以不同的方式来处理这个问题,这也会很有帮助。

您将多边形视为一个函数,但它不是。使用MS SQL server,空间数据在IMHO中不是一项容易的任务(postgreSQL和postGIS在这方面看起来更具吸引力)多边形((…)'是由MS SQL server解析的几何体字符串。就你而言,即:

CREATE TABLE Field
  (
    FieldId         INT      IDENTITY NOT NULL PRIMARY KEY
  , FieldLength     INT      NOT NULL
  , FieldWidth      INT      NOT NULL
  , FieldHalfLength AS FieldLength / 2
  , LeftHalfField   GEOMETRY NULL
  , RightHalfField  GEOMETRY NULL
  );

INSERT INTO Field(FieldLength, FieldWidth)VALUES(4134, 2678);



UPDATE
  Field
SET
  LeftHalfField='POLYGON(( 0 0,'+CAST(FieldHalfLength AS VARCHAR(10))+' 0, '
                +CAST(FieldHalfLength AS VARCHAR(10))+' '+CAST(FieldWidth AS VARCHAR(10))+', 0 '
                +CAST(FieldWidth AS VARCHAR(10))+', 0 0))'
, RightHalfField='POLYGON(('+CAST(FieldHalfLength AS VARCHAR(10))+' 0, '
                 +CAST(FieldLength AS VARCHAR(10))+' 0,'+CAST(FieldLength AS VARCHAR(10))+' '
                 +CAST(FieldWidth AS VARCHAR(10))+','+CAST(FieldHalfLength AS VARCHAR(10))+' '
                 +CAST(FieldWidth AS VARCHAR(10))+','+CAST(FieldHalfLength AS VARCHAR(10))+' 0))';

SELECT * FROM dbo.Field;
编辑:您也可以使用计算列来完成这一切:

CREATE TABLE Field
  (
    FieldId         INT      IDENTITY NOT NULL PRIMARY KEY
  , FieldLength     INT      NOT NULL
  , FieldWidth      INT      NOT NULL
  , FieldHalfLength AS FieldLength / 2
  , LeftHalfField  AS CAST('POLYGON(( 0 0,'+CAST((FieldLength / 2) AS VARCHAR(10))+' 0, '
                +CAST((FieldLength / 2) AS VARCHAR(10))+' '+CAST(FieldWidth AS VARCHAR(10))+', 0 '
                +CAST(FieldWidth AS VARCHAR(10))+', 0 0))' AS GEOMETRY),
   RightHalfField AS cast('POLYGON(('+CAST((FieldLength / 2) AS VARCHAR(10))+' 0, '
                 +CAST(FieldLength AS VARCHAR(10))+' 0,'+CAST(FieldLength AS VARCHAR(10))+' '
                 +CAST(FieldWidth AS VARCHAR(10))+','+CAST((FieldLength / 2) AS VARCHAR(10))+' '
                 +CAST(FieldWidth AS VARCHAR(10))+','+CAST((FieldLength / 2) AS VARCHAR(10))+' 0))' AS GEOMETRY)
  );

INSERT INTO Field(FieldLength, FieldWidth)VALUES(4134, 2678);
SELECT * FROM dbo.Field;

您使用的是哪种数据库管理系统?(多边形是内置函数吗?)。我认为多边形是一个内置函数。不是,至少不是这样--
GEOMETRY
函数只在
GEOMETRY
字符串中有效。不幸的是,T-SQL没有提供从类型化数据创建这些字符串的方便方法,您只需将
CONCAT
填充在一起,然后再将其馈送到
STPolyFromText
/
Parse
.Gack。至少使用
CONCAT
这样你就可以摆脱所有的
CAST
s(
CONCAT
隐式CAST)。@jeroenmoster,“Gack”是什么?顺便说一句,我不在乎去掉cast。好吧——如果你真的认为它比(例如,
CONCAT(“多边形((0,,,FieldLength/2,,,0,,,FieldLength/2,,,FieldWidth,,,0',FieldWidth,,,0)))更具可读性。
我想我们只是有着不同的品味。(事实上,我更喜欢
REPLACE(REPLACE('POLYGON((0,$HalfFieldLength 0,$HalfFieldLength$FieldWidth,0$FieldWidth,0)),“$HalfFieldLength',FieldLength/2),”$FieldWidth',FieldWidth)
,即使嵌套变得不舒服。)@JeroenMostert,正如你所说的,这只是口味的问题,对结果没有任何影响。(你还没有说出“嘎克”是什么意思,希望这不是故意的侮辱)。“Gack”是一个拟声词,表示当你看到令人讨厌的东西时发出的声音,比如“我绝对不喜欢这个代码的外观”。我对这段代码的美学观点对您没有任何影响(或者至少它不打算这样做)。