从 R 查询 SQL 服务器地理空间数据
Querying SQL Server geospatial data from R
已编辑:我已将登录详细信息添加到演示 SQL Server 2017。
我正在使用 FreeTDS 驱动程序从 R 查询 SQL 服务器(优先于 Microsoft odbc 驱动程序,因为它支持 Linux 中的 Windows 身份验证)。
我很难用 st_read
解释几何列。
连接是这样发起的:
library(odbc)
library(DBI)
library(sf)
username <- 'SO-user'
sql_server_ip <- '35.214.169.110'
password <- 'SQLaskingfortrouble?!'
con <- dbConnect(odbc(),
Driver = "FreeTDS",
Server = sql_server_ip,
Database = "Whosebug-example",
UID = username,
PWD = password,
Port = 1433)
# I have also tried Driver = "ODBC Driver 17 for SQL Server"
查询结果如下:
data <- dbGetQuery(con, 'SELECT TOP 2
objectid, geom,
geom.STGeometryType() geom_type,
geom.STSrid STSrid
FROM spatialdata')
objectid geom geom_type stsRID
864 blob[416 B] LineString 25832
865 blob[416 B] LineString 25832
class(data$geom)
"blob" "vctrs_list_of" "vctrs_vctr"
raw/blob 几何体看起来像十六进制:
rawToHex(data$geom[1])
e86400000104180000004003780b38331f416b4df3ea9ecf5741a04c150c38331f4159ca32f09ecf574160ba...
尝试使用 st_read
,这样我就可以从中得到一个有用的 sf 数据框,根据我传递给函数的选项,我得到了一系列错误消息:
st_read(con, geometry_column = "geom",
query = "SELECT TOP 10 objectid, geom FROM \"spatialdata\"")
Error: nanodbc/nanodbc.cpp:1617: 00000: [FreeTDS][SQL Server]Invalid object name 'spatial_ref_sys'. [FreeTDS][SQL Server]Statement(s) could not be prepared.
<SQL> 'select srtext from spatial_ref_sys where srid = 70647808'
In addition: Warning message:
In CPL_crs_from_input(x) :
GDAL Error 6: EPSG PCS/GCS code 70647808 not found in EPSG support files. Is this a valid EPSG coordinate system?
似乎没有正确识别 EPSG (25832)。
在我的案例中 st_read 的正确构造是什么?
奖金问题:如何有效地将边界框附加到 st_read?
你试过WKB表示法吗?
mytest <- st_read(con, geometry_column = "geom",
query = "
select geometry::STGeomFromText('POLYGON ((0 0, 1.5 0, 1.5 1.5, 0 1.5, 0 0))', 0).STAsBinary() as geom
union all
select geometry::Parse('CIRCULARSTRING(0 0, 1 1.10, 2 2.3246, 0 7, -3 2.3246, -1 2.1082, 0 0)').STAsBinary() as geom;
")
plot(mytest)
这里的问题是您想将 MSSQL 存储几何数据的格式转换为 sf 包可以理解的格式。 STAsBinary() 应该可以工作。
data <- dbGetQuery(con, 'SELECT TOP 2
objectid,
geom.STAsBinary(),
geom.geom_type,
geom.STSrid STSrid
FROM spatialdata')
然后 st_read(data)
应该工作
已编辑:我已将登录详细信息添加到演示 SQL Server 2017。
我正在使用 FreeTDS 驱动程序从 R 查询 SQL 服务器(优先于 Microsoft odbc 驱动程序,因为它支持 Linux 中的 Windows 身份验证)。
我很难用 st_read
解释几何列。
连接是这样发起的:
library(odbc)
library(DBI)
library(sf)
username <- 'SO-user'
sql_server_ip <- '35.214.169.110'
password <- 'SQLaskingfortrouble?!'
con <- dbConnect(odbc(),
Driver = "FreeTDS",
Server = sql_server_ip,
Database = "Whosebug-example",
UID = username,
PWD = password,
Port = 1433)
# I have also tried Driver = "ODBC Driver 17 for SQL Server"
查询结果如下:
data <- dbGetQuery(con, 'SELECT TOP 2
objectid, geom,
geom.STGeometryType() geom_type,
geom.STSrid STSrid
FROM spatialdata')
objectid geom geom_type stsRID
864 blob[416 B] LineString 25832
865 blob[416 B] LineString 25832
class(data$geom)
"blob" "vctrs_list_of" "vctrs_vctr"
raw/blob 几何体看起来像十六进制:
rawToHex(data$geom[1])
e86400000104180000004003780b38331f416b4df3ea9ecf5741a04c150c38331f4159ca32f09ecf574160ba...
尝试使用 st_read
,这样我就可以从中得到一个有用的 sf 数据框,根据我传递给函数的选项,我得到了一系列错误消息:
st_read(con, geometry_column = "geom",
query = "SELECT TOP 10 objectid, geom FROM \"spatialdata\"")
Error: nanodbc/nanodbc.cpp:1617: 00000: [FreeTDS][SQL Server]Invalid object name 'spatial_ref_sys'. [FreeTDS][SQL Server]Statement(s) could not be prepared.
<SQL> 'select srtext from spatial_ref_sys where srid = 70647808'
In addition: Warning message:
In CPL_crs_from_input(x) :
GDAL Error 6: EPSG PCS/GCS code 70647808 not found in EPSG support files. Is this a valid EPSG coordinate system?
似乎没有正确识别 EPSG (25832)。
在我的案例中 st_read 的正确构造是什么?
奖金问题:如何有效地将边界框附加到 st_read?
你试过WKB表示法吗?
mytest <- st_read(con, geometry_column = "geom",
query = "
select geometry::STGeomFromText('POLYGON ((0 0, 1.5 0, 1.5 1.5, 0 1.5, 0 0))', 0).STAsBinary() as geom
union all
select geometry::Parse('CIRCULARSTRING(0 0, 1 1.10, 2 2.3246, 0 7, -3 2.3246, -1 2.1082, 0 0)').STAsBinary() as geom;
")
plot(mytest)
这里的问题是您想将 MSSQL 存储几何数据的格式转换为 sf 包可以理解的格式。 STAsBinary() 应该可以工作。
data <- dbGetQuery(con, 'SELECT TOP 2
objectid,
geom.STAsBinary(),
geom.geom_type,
geom.STSrid STSrid
FROM spatialdata')
然后 st_read(data)
应该工作