2019独角兽企业重金招聘Python工程师标准>>>
刚接触2008的空间存储,资料比较少,在数据库操作中有很多不懂的地方,包括用法,语法等,经过同事的指点明白了一些,感谢大腿同事·~这里只记录数据库操作部分。
方法描述
- STAsText()
返回类型:nvarchar SqlChars
返回 geometry 实例的开放地理空间联盟 (OGC) 熟知文本 (WKT) 表示形式。此文本将不包含该实例传递的任何 Z(标高)或 M(度量)值。
- STDistance()
返回类型:float SqlDouble
STDistance(other_geometry) 返回一个 geometry 实例中的点与另一个 geometry 实例中的点之间的最短距离。 参数:将与在其上调用 STDistance() 的实例进行比较的另一个 geometry 实例。
- STIntersects()
返回类型:bit SqlBoolean
STIntersects(other_geometry) 如果 geometry 实例与另一个 geometry 实例相交,则返回 1。否则,返回 0。 参数:另一个 geometry 实例,将与调用 STIntersects() 所在的实例进行比较。
实际应用-ArcGis
数据库表及实体类变量声名(wj_point 点数据):
数据库表及实体类变量声名(wj_polygon 面数据, 字段属性与上表一致,区别在于shp数据一个存储的是点,一个是面):
需求描述1:输入一个坐标点查询数据库中距离该点最近小于30米的点位,且只返回第一个结果
解释:ArcGis移动端应用,通过触屏方式,可获取到一个坐标值,通过数据库查询返回结果
关联:geography::STGeomFromText(),STDistance() => 距离,4326 => WGS84坐标系
SQL:
SELECT TOP 1 a.id AS "id",a.name AS "name",a.cj_pic AS "cjPic",a.cj_note AS "cjNote",a.cj_flag AS "cjFlag",a.fk_pic AS "fkPic",a.fk_note AS "fkNote",a.shp.STAsText() AS "shp"
FROM wj_point a WHERE geography::STGeomFromText('POINT (110.469908 19.927712)', 4326).STDistance(geography::STGeomFromText(a.shp.STAsText(), 4326))<=30
需求描述2:输入一个坐标点查询数据库中包含了该点位的面,且只返回第一个结果
解释:ArcGis移动端应用,通过触屏方式,可获取到一个坐标值,通过数据库查询返回结果
关联:geometry::STGeomFromText(),STIntersects() => 包含
SQL:
SELECT TOP 1 a.id AS "id",a.name AS "name",a.cj_pic AS "cjPic",a.cj_note AS "cjNote",a.cj_flag AS "cjFlag",a.fk_pic AS "fkPic",a.fk_note AS "fkNote",a.shp.STAsText() AS "shp"
FROM wj_polygon a WHERE geometry::STGeomFromText('POINT (110.469908 19.927712)', 0).STIntersects(geometry::STGeomFromText(a.shp.STAsText(), 0))=1
需求描述3:输入一个范围内最小xy和最大xy坐标值,4个值构成一个面,查询数据库中坐落在该面上的所有坐标点
解释:ArcGis移动端应用,通过手机屏幕的范围坐标值,通过数据库查询返回结果
关联:geometry::STGeomFromText(),STIntersects() => 包含
SQL:xmin,xmax,ymin,ymax分别代表x坐标值和y坐标值的最大最小值
SELECT a.id AS "id",a.name AS "name",a.cj_pic AS "cjPic",a.cj_note AS "cjNote",a.cj_flag AS "cjFlag",a.fk_pic AS "fkPic",a.fk_note AS "fkNote",a.shp.STAsText() AS "shp"
FROM wj_point a WHERE geometry::STGeomFromText('POLYGON ((xmin ymin,xmax ymin,xmax ymax,xmin ymax))', 0).STIntersects(geometry::STGeomFromText(a.shp.STAsText(), 0))=1
需求描述4:输入一个范围内最小xy和最大xy坐标值,4个值构成一个面,查询数据库中所有与该面相交的面
解释:ArcGis移动端应用,通过手机屏幕的范围坐标值,通过数据库查询返回结果
关联:geometry::STGeomFromText(),STIntersects() => 相交
SQL:
SELECT TOP 1 a.id AS "id",a.name AS "name",a.cj_pic AS "cjPic",a.cj_note AS "cjNote",a.cj_flag AS "cjFlag",a.fk_pic AS "fkPic",a.fk_note AS "fkNote",a.shp.STAsText() AS "shp"
FROM wj_polygon a WHERE geometry::STGeomFromText('POLYGON ((xmin ymin,xmax ymin,xmax ymax,xmin ymax))', 0).STIntersects(geometry::STGeomFromText(a.shp.STAsText(), 0))=1
需求描述5:插入数据(点)或(面)
解释:通过Web后端导入shp文件数据,执行数据库插入数据操作
关联:geometry::STGeomFromText()
SQL1:点位shp数据格式,POINT (x y)
SQL2:面shp数据格式,POLYGON ((x1 y1,x2 y2,x3 y3))
INSERT INTO wj_point(name,cj_pic,cj_note,cj_flag,fk_pic,fk_note,shp) VALUES ('0','0','0','0','0','0',(geometry::STGeomFromText('POINT (x y)', 0)))
需求描述6:查询数据库(点)和(面)表中,最小的xy和最大的xy值信息。
解释:ArcGis移动端应用,点击全图缩放到海南岛,查询出数据库中xy最大最小值,利用该值继续查询出所有数据,与需求3和4联合使用
关联:geometry::STGeomFromText(),STStartPoint(),STX,STY
SQL:
SELECT MIN(minx) minx, MIN(miny) miny, MAX(maxx) maxx, MAX(maxy) maxy FROM( SELECTMIN(geometry::STGeomFromText(geometry::STGeomFromText(a.shp.STAsText(), 0).STStartPoint().ToString(), 0).STX) minx, MIN(geometry::STGeomFromText(geometry::STGeomFromText(a.shp.STAsText(), 0).STStartPoint().ToString(), 0).STY) miny, MAX(geometry::STGeomFromText(geometry::STGeomFromText(a.shp.STAsText(), 0).STStartPoint().ToString(), 0).STX) maxx, MAX(geometry::STGeomFromText(geometry::STGeomFromText(a.shp.STAsText(), 0).STStartPoint().ToString(), 0).STY) maxy FROM wj_point aUNIONSELECTMIN(geometry::STGeomFromText(geometry::STGeomFromText(b.shp.STAsText(), 0).STStartPoint().ToString(), 0).STX) minx, MIN(geometry::STGeomFromText(geometry::STGeomFromText(b.shp.STAsText(), 0).STStartPoint().ToString(), 0).STY) miny, MAX(geometry::STGeomFromText(geometry::STGeomFromText(b.shp.STAsText(), 0).STStartPoint().ToString(), 0).STX) maxx, MAX(geometry::STGeomFromText(geometry::STGeomFromText(b.shp.STAsText(), 0).STStartPoint().ToString(), 0).STY) maxy FROM wj_polygon b) AS c