当前位置: 首页 > 知识库问答 >
问题:

将mssql空间字段导入geopandas/shapely几何

袁凌
2023-03-14

我似乎无法将mssql空间字段直接导入geopandas。我可以用Pymssql将普通mssql表导入pandas,但我无法找到将空间字段导入shapely几何体的方法。我知道mssql的OGR驱动程序应该能够处理它,但我对sql的掌握还不够熟练,无法解决这个问题。对于直线和多边形来说,这是一个更大的问题,因为点可以从mssql字段转换为x和y坐标。谢谢

共有2个答案

景理
2023-03-14

我喜欢这个函数,感谢Dryden,但是拉几何的代码有多边形字段的问题。如果其中一个记录的几何形状是多边形,并且使用.STGeometryN(1)代码您只得到记录中潜在的几个多边形中的第一个。地理数据框不会以该记录的总几何结束。你调整代码并删除。STGeometryN(1)它应该处理多边形。

我用这个来拉普查区块组我已经存储在SQL服务器和与一点调整(应该包括数据库模式参数)我得到了它的工作,但我会警告其他人谁使用它是为了确保你知道首先使用此查询的数据中是否有多边形SQL。

select geometrycolumn.STGeometryType(), 
,geometrycolumn.STNumGeometries() 
 from yourtable
 order by 1

这将告诉您是否有多个多边形以及每个记录有多少个多边形。

澹台镜
2023-03-14

我通过正确地查询sql数据库表并通过shapely中的loads函数将wkt字符串转换为shapely几何体来解决这个问题。wkt。

我不是程序员,所以请记住函数的组织。该函数可以导入带有或不带有GIS几何图形的mssql表。

from pymssql import connect
from pandas import read_sql
from shapely.wkt import loads
from geopandas import GeoDataFrame

def rd_sql(server, database, table, col_names=None, where_col=None, where_val=None, geo_col=False, epsg=2193, export=False, path='save.csv'):
    """
    Imports data from MSSQL database, returns GeoDataFrame. Specific columns can be selected and specific queries within columns can be selected. Requires the pymssql package, which must be separately installed.
    Arguments:
    server -- The server name (str). e.g.: 'SQL2012PROD03'
    database -- The specific database within the server (str). e.g.: 'LowFlows'
    table -- The specific table within the database (str). e.g.: 'LowFlowSiteRestrictionDaily'
    col_names -- The column names that should be retrieved (list). e.g.: ['SiteID', 'BandNo', 'RecordNo']
    where_col -- The sql statement related to a specific column for selection (must be formated according to the example). e.g.: 'SnapshotType'
    where_val -- The WHERE query values for the where_col (list). e.g. ['value1', 'value2']
    geo_col -- Is there a geometry column in the table?
    epsg -- The coordinate system (int)
    export -- Should the data be exported
    path -- The path and csv name for the export if 'export' is True (str)
    """
    if col_names is None and where_col is None:
        stmt1 = 'SELECT * FROM ' + table
    elif where_col is None:
        stmt1 = 'SELECT ' + str(col_names).replace('\'', '"')[1:-1] + ' FROM ' + table
    else:
        stmt1 = 'SELECT ' + str(col_names).replace('\'', '"')[1:-1] + ' FROM ' + table + ' WHERE ' + str([where_col]).replace('\'', '"')[1:-1] + ' IN (' + str(where_val)[1:-1] + ')'
    conn = connect(server, database=database)
    df = read_sql(stmt1, conn)

    ## Read in geometry if required
    if geo_col:
        geo_col_stmt = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=" + "\'" + table + "\'" + " AND DATA_TYPE='geometry'"
        geo_col = str(read_sql(geo_col_stmt, conn).iloc[0,0])
        if where_col is None:
            stmt2 = 'SELECT ' + geo_col + '.STGeometryN(1).ToString()' + ' FROM ' + table
        else:
            stmt2 = 'SELECT ' + geo_col + '.STGeometryN(1).ToString()' + ' FROM ' + table + ' WHERE ' + str([where_col]).replace('\'', '"')[1:-1] + ' IN (' + str(where_val)[1:-1] + ')'
        df2 = read_sql(stmt2, conn)
        df2.columns = ['geometry']
        geometry = [loads(x) for x in df2.geometry]
        df = GeoDataFrame(df, geometry=geometry, crs={'init' :'epsg:' + str(epsg)})

    if export:
        df.to_csv(path, index=False)

    conn.close()
    return(df)

编辑:使函数自动找到几何字段(如果存在)。

 类似资料:
  • 我试图在GeoPandas中找到两个多边形的并集,并输出一个包含两个多边形的点作为其顶点的单个几何体。函数为每个单独的并集提供多边形,但我想要一个多边形。 在上下文中,我使用它将两个行政区域合并为一个区域(即包括一个国家内的一个城镇区)。 下面的例子来自geopandas网站,说明了我想要的: 没有一个输出几何是我所期望的,这是以下内容: 首先,如何使用GeoPandas或shapely从输入多边

  • 我有一个数据帧存储为csv文件,其中一列是多边形对象。但是,此列存储为字符串,而不是GeoPandas几何对象。如何将此列转换为Geopandas几何对象,以便执行地理分析? 这就是我的数据的样子 我想将此Pandas数据帧转换为Geopandas GeopataFrame,使用列“geometry”作为Geopandas geometry列。 但是,由于列存储为字符串,因此Geopandas。D

  • 假设我有两个不相交的多边形组/“岛屿”(想想两个不相邻县的人口普查区)。我的数据可能看起来像这样: 我希望每个岛内的多边形采用表示其组的ID(可以是任意的)。例如,左下角的3个多边形的IslandID为1,右上角的3个多边形的IslandID为2。 我已经开发了一种方法来做到这一点,但我想知道这是否是最好/最有效的方法。我做以下工作: 1) 创建一个几何体等于多多边形一元并集内多边形的地理数据框。

  • 如何在div之间添加垂直空间。这里是否可以添加引导类?有什么帮助吗? 下面是我的代码片段:

  • 我有一个包含调度插槽的表,称为: ScheduleSlots 字段: id(int) scheduleID(int) time(datetime) availableslots(int) CalendarGroupID(int) Level(int) enabled(bit) 我想要设置一个gridview,在其中获取所有日期并计算每天的已启用和已禁用日期。 我不确定如何编写sql语句来执行此操作