在SQL中创建多边形
仍在学习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 );
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”是一个拟声词,表示当你看到令人讨厌的东西时发出的声音,比如“我绝对不喜欢这个代码的外观”。我对这段代码的美学观点对您没有任何影响(或者至少它不打算这样做)。