【问题标题】:How to use preparedstatement to update data in SQL Server column with "Geometry"如何使用preparedstatement通过“几何”更新SQL Server列中的数据
【发布时间】:2017-02-26 19:53:27
【问题描述】:

我想用几何数据类型更新表格列中的数据。我有一个 GIS Web 服务,它返回带有 X 和 Y 值的 JSON 响应。我已经从 JSON 中检索了这些值以及其他字符串和 Int 数据类型列所需的其他值。应用程序中的 Java 代码运行良好,但我的问题是如何使用“几何”数据类型“更新”数据。

在数据库中有一些样本数据,格式如下“0x346C0000010CFFC7C50034B01B41BC2D52FF8F660941”。我不知道如何使用 preparestatement 以这种格式设置 X&Y 数据。任何见解或建议都会有所帮助。

在做了一些研究后,我知道如何查询和转换这些数据,但不知道在我的程序中要做什么。

SELECT Shape.STX as x ,Shape.STY as y from Test
WHERE ID=14082

更新

"Insert INTO Test(column1, Column2, Column3, Column4, geom)
    VALUES (?, ?, ?, ?,ST_GeomFromText(?, 2100));"

pst.setString(5,"POINT("+lat+" "+log+")" );

我现在找到了这个解决方案,但我不知道上述查询中的“2100”是什么意思。也许是错的,我现在没有设置,但如果我找到任何关于更新查询的解决方案,我会更新这篇文章。同时,如果有人有任何解决方案,请随时更新帖子。

【问题讨论】:

  • 找到带有“STPointFromText”的东西是正确的方向吗?
  • 我可以为“STPointFromText”使用标准 JDBC 驱动程序吗?是否有任何其他方法可以从标准 JDBC 驱动程序中使用,如果我不能使用此方法,它将执行与 ST_GeomFromText 相同的结果。

标签: java sql-server prepared-statement gis


【解决方案1】:

这是插入和检索空间数据的方法。 HTH。


在 SQL Server 中插入和检索空间数据:

空间数据主要使用2种数据类型:

  1. 几何 - 用于平面上的 2d。
  2. 地理 - 用于全球/圆形表面上的 3d。

所有空间数据都存储在 x-y 坐标中。为了处理空间数据,DML 语句使用写成字符串(在“引号”内)的空间函数,因为它们是 WKT(众所周知的文本)格式,例如'POINT(5 3)' (注意:WKT 是一种用于表示矢量几何对象的文本标记语言)。以下是一些常用功能:(详细解释请参考MSDN):

数据插入

可以在 INSERT 语句中使用以下函数。例如

INSERT INTO Tbl1 (mySpatialColumn) Values ('LineString(-1 -2, 6 7))

• 'Point(int x int y)' : 0 维对象或只是一个点。

• 'LineString(x1 y1, x2 y2, x.. y..)'

• 'CircularString(x1 y1, x2 y2, x.. y..)'

• 'CompoundCurve(x1 y1, x2 y2, x.. y..)'

• '多边形(x1 y1, x2 y2, x.. y..)'

• 'CurvePolygon(x1 y1, x2 y2, x.. y..)'

• 'MultiPoint':多个点的集合,例如:'MultiPoint((2 3), (7 8 9.5))'

• 'MultiLineString((x1 y1, x.. y..), (x1 y1, x.. y..))':多行,例如:'MultiLineString((1 1, 3 5), ( -5 3, -8 -2))'

• 'MultiPolygon((x1 y1, x.. y..), (x1 y1, x.. y..))':多个多边形的集合。

数据检索:

以下函数可用于 SELECT 语句。例如:

SELECT mySpatialCol.ToSting(), mySpatialCol.AsGml() FROM Tbl1;

• .ToString():以与最初插入相同的格式显示结果,即作为带有参数值(而不是十六进制值)的源函数,例如:colName.ToString() 将显示:LineString(0 0, 7 8).

• .AsGml():转换并返回 GML/XML 格式的值(而不是返回十六进制或源函数),例如对于 LineString() 值 - colName.AsGml() 将返回:

<LineString xmlns="www.example.com/gml"><posList>0 0 7 8</posList></LineString>

注意:在 SSMS (Management Studio) 中,您可以将检索到的结果作为数据本身(十六进制值)查看,也可以查看空间结果,即形状/图表(参见下面的示例):

【讨论】:

  • 感谢 Eddie 的一些注释...但是你知道我是否可以将 POINT 与通常的 Sql JDBC 驱动程序一起用于 sql server 吗?或者我需要其他一些用于 POINT 的 jdbc 驱动程序?
  • 您好,您不需要特定的 JDBC 驱动程序即可使用 SQL Server 的任何空间功能(自 Sql Server 2012 以来一直存在)。只要您可以从 Java 代码连接到 dbms,您就应该能够使用 POINT() 函数。 AFAIK,它将由 SQL 的引擎(而不是 JVM)处理。
  • 我正在使用的 sql server 是 2008 .....这就是为什么我不确定我发布的查询是否可以与我的 Java 代码一起使用。您对我在 sql server 2008 中需要做什么有任何见解吗?
  • 另外从你的笔记中我可以在结果选项卡中看到数据是十六进制值,所以如果我的假设是错误的,请更正,当我们使用点函数时,它会自动将其转换为十六进制值吗?跨度>
  • SS 2008 对空间数据有基本支持,Point 类存在(2008 年),是的,使用 Point() 输入的数据被转换并以十六进制存储。请参阅 Microsoft 发布的 official paper,其中包含空间方法和类的兼容性级别,即 SS 2008/12 中的可用性 - 请参阅附录 I 和 II。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多