R Converting SQL Server Query with Geometry Datatype to spatialpolygonsdataframe

时间:2017-04-10 03:20:55

标签: sql-server r gis

I am trying to plot geometry (binary) polygon data from an SQL Server data source. What I want to do is use the Geometry Data Type from the SQL query for the polygons, and also the rest of the columns in the query as the @data attribute table within the SpatialPolygonsDataFrame class.

This is my code so far, to get the SQL query data into a simple data.frame and convert the binary datatype using wkb::readWKB().

From this stage, I do not know how to create the SpatialPolygonsDataFrame dataframe.

library(RODBC) 
library(maptools)
library(rgdal)
library(ggplot2)
dbhandle <- odbcDriverConnect("connection string",rows_at_time = 1)
sqlStatement <- "SELECT  ID 
                    , shape.STAsBinary() as shape
                    , meshblock_number 
                    , areaunit_code
                    , dpz_code
                    , catchment_id 
                    FROM [primary_parcels] hp "

sqlStatement <- gsub("[\r\n]", "", sqlStatement)
parcelData <- sqlQuery(dbhandle,sqlStatement )
odbcClose(dbhandle)
parcelData$shape <- wkb::readWKB(parcelData$shape)

1 个答案:

答案 0 :(得分:0)

然而,这可能为时已晚,在朋友的帮助下this我找到了解决方案。这似乎有点滑稽,但我也在研究一组类似的数据并遇到同样的问题。请记住,由于您没有提供可复制的示例,因此很难复制您的方法。您还需要调整投影。请注意,在odbc中构建连接更容易,并且每次都要调用它,而不是每次都写入连接。

library(rgeos)
library(mapview)
library(raster)
library(dplyr)
library(sp)

#You may ignore this
odbcCh<-odbcConnect("Rtest")
sqlStatement=sqlQuery(odbcCh, 'SELECT  ID , shape.STAsBinary() as shape, meshblock_number , areaunit_code, dpz_code, catchment_id FROM [primary_parcels] hp')
parcelData <- sqlQuery(odbcCh,sqlStatement )
#untill here

things <- vector("list", 1)
z = 0
for(line in parcelData$shape)
{
      {
        things[[z+1]]<-readWKT(line)
      }
      z = z + 1
}

Things <- do.call(bind,things)
Things.df= SpatialPolygonsDataFrame(Things,data.frame(parcelData$ID,parcelData$catchment_id))
plot(Things.df)

#you may not need the rest
Things.df@proj4string= CRS("+proj=nzmg +lat=-41.0 +lon=173.0 +x_0=2510000.0     +y_0=6023150.0 +ellps=intl +units=m")
mapview(Things.df)