---
schema_version: "1"
id: abf2e612503bb1949f8b130bb0dcd58f120e768faaa2a4930aec60d129a28c20
title: 连接到数据库中的空间数据
collection: tableau
version: next
locale: zh-cn
portal_url: https://docs.salesforce.com/tableau/next/zh-cn/pro/desktop/maps_spatial_sql.md
canonical_url: https://help.tableau.com/v0.0/pro/desktop/zh-cn/maps_spatial_sql.htm
source_site: help.tableau.com
content_type: documentation
content_hash: f88be803c4cf2131df9f47321bea0ad683ba2255d959664ef6a3ba1758ea6304
description: Connect to spatial data in a database and use custom SQL or RAWSQL for analysis.
---
[跳转到主要内容](#main-content)

# 连接到数据库中的空间数据

您可以使用存储在数据库中的空间列在 Tableau 中构建地图可视化项。您可以连接到支持的空间数据源并使用它们构建可视化项以分析空间数据，或者您可以连接到自定义 SQL 或 RAWSQL 查询以执行高级空间分析。

Tableau 支持使用以下连接器直接连接到空间数据：

- Amazon Redshift
- Microsoft SQL Server
- Google BigQuery（从 Tableau 2026.2 开始）
- Oracle
- PostgreSQL + PostGIS
- Pivotal Greenplum + PostGIS
- Snowflake

有关使用这些连接器的信息，请参见[Microsoft SQL Server](https://help.tableau.com/v0.0/pro/desktop/zh-cn/examples_sqlserver.htm)、[PostgreSQL](https://help.tableau.com/v0.0/pro/desktop/zh-cn/examples_postgresql.htm)、[Pivotal Greenplum Database](https://help.tableau.com/v0.0/pro/desktop/zh-cn/examples_greenplum.htm)、[Oracle](https://help.tableau.com/v0.0/pro/desktop/zh-cn/examples_oracle.htm)或[Snowflake](https://help.tableau.com/v0.0/pro/desktop/zh-cn/examples_snowflake.htm)连接器示例。

## 支持的空间数据和 SRID

对于 Microsoft SQL Server，只支持**地理类型**空间数据。

**PostgreSQL + PostGIS**、Oracle 以及 **Pivotal Greenplum + PostGIS** 支持几何和地理类型的字段。地理字段必须指定地理类型（例如，POINT、LINESTRING）和 SRID 才能被识别为空间字段。地理字段必须指定地理类型才能被识别。

**注意**：在 PostgreSQL + PostGIS 中，您可以连接到包含混合几何类型（点、线和多边形）的表，但 Tableau 将不会同时呈现这些类型。

这些连接器支持以下 **SRID**：

- NAD83 (EPSG:4269)
- ETRS89 (EPSG:4258)
- WGS84 (EPSG:4326)

在 PostgreSQL + PostGIS 中，SRID 始终默认为 WGS84 (EPSG:4326)。

Tableau 支持使用这些连接器进行实时连接和数据提取连接。

## 连接到空间列

**注意**：从 Tableau 2026.2 开始，您可以连接到 [Google BigQuery](https://help.tableau.com/v0.0/pro/desktop/zh-cn/examples_googlebigquery.htm) 中的空间列。

1. 打开 Tableau 并连接到数据。  
    有关如何使用支持的连接器连接到数据的详细信息，请参见[Microsoft SQL Server](https://help.tableau.com/v0.0/pro/desktop/zh-cn/examples_sqlserver.htm)、[PostgreSQL](https://help.tableau.com/v0.0/pro/desktop/zh-cn/examples_postgresql.htm)、[Oracle](https://help.tableau.com/v0.0/pro/desktop/zh-cn/examples_oracle.htm)、[Pivotal Greenplum Database](https://help.tableau.com/v0.0/pro/desktop/zh-cn/examples_greenplum.htm)或[Snowflake](https://help.tableau.com/v0.0/pro/desktop/zh-cn/examples_snowflake.htm)连接器示例。
2. 在“数据源”页面左侧窗格中的“表”下，将一个包含空间数据的表拖到画布上。  
    ![“Seattle Public Schools”（西雅图公立学校）数据源被拖到“数据源”画布上。](/tableau/next/zh-cn/pro/desktop/zh-cn/Img/maps_sql2.png)  
    
    空间列显示的名称与他们在数据库中的名称相同。
    
    现在即可使用空间数据在 Tableau 中构建地图。有关如何依据空间文件创建地图的详细信息，请参见[依据空间数据构建地图视图](https://help.tableau.com/v0.0/pro/desktop/zh-cn/maps_shapefiles.htm#Build)。

## 使用自定义 SQL 和 RAWSQL 执行高级空间分析

### 连接到自定义 SQL 查询

1. 打开 Tableau 并连接到数据库。
2. 在“数据源”页面的左侧窗格中，将“新建自定义 SQL”拖到画布上。
3. 在出现的“编辑自定义 SQL”对话框中键入或粘贴您的查询。有关可用于空间数据的自定义 SQL 的示例，请参见[自定义 SQL 查询示例](#CustomSQL)。
4. 完成后，单击“确定”。

有关详细信息，请参见[连接到自定义 SQL 查询](https://help.tableau.com/v0.0/pro/desktop/zh-cn/customsql.htm)。

### 自定义 SQL 查询示例

下面是一些查询示例。请注意，自定义 SQL 查询将因数据源而异。

#### 如果您的数据有两组点（例如学校和公园），并且您想要显示它们的相交位置：

SELECT S.\[name\] as SchoolName, P.\[name\] as PubSpaceName, S.geog\_schools.STBuffer(<Parameters.Radius>) as Geog\_School, P.geog\_pub\_space as Geog\_Pub\_Space FROM TestSpatial.dbo.seattle\_public\_schools S LEFT JOIN TestSpatial.dbo.seattle\_pub\_space P ON S.geog\_schools.STBuffer(<Parameters.Radius>).STIntersects(P.geog\_pub\_space) = 1

此示例查询将为公共空间多边形在学校半径距离（米）内的每种情况生成一行。查询结果在数据网格中如下所示：

![具有两个应用了地理角色的字段的“数据源”窗格。](/tableau/next/zh-cn/pro/desktop/zh-cn/Img/maps_sql3.png)

**注意**：此示例引用名为“Radius”的参数。该参数测量距离（米），并具有以下设置：

- 数据类型：浮点
- 当前值：600
- 允许的值：范围
- 最小值：100
- 最大值：2,000
- 步长：50

使用该参数，您可以动态调整学校与公共空间之间的关系。

有关详细信息，请参见[在自定义 SQL 查询中使用参数](https://help.tableau.com/v0.0/pro/desktop/zh-cn/customsql.htm#parameters)。

#### 如果只需要特定的点周围的数据

`SELECT * FROM [Test_spatial_<username>].[dbo].[SDOT_Collisions] C WHERE C.geom.STIntersects(geography::STGeomFromText('POINT(-122.344706 47.650388)', 4326).STBuffer(1000))=1`

此示例查询只查询 POINT 周围 1000 米范围内的数据。像[第一个示例中使用的参数](#Radius)一样，半径可以是参数。

或者也可以使用矩形，而不是点和半径。例如：

`SELECT * FROM [Test_spatial_<username>].[dbo].[SDOT_Collisions] C   WHERE C.geom.STIntersects(geography::STGeomFromText('POLYGON ((-122.3625 47.6642,-122.3625 47.6493,-122.3427 47.6493,-122.3422 47.6642,-122.3625 47.6642))', 4326))=1`

多边形点的卷绕顺序（顺时针或逆时针）确定您将获得哪一组点。您可以使用 SQL Server 函数 ReorientObject() 反转卷绕顺序。

#### 如果看到有关混合数据类型的错误

`SELECT *, F.geom.STGeometryType() as geomtype FROM [Test_spatial_<username>].[dbo].[us_historic_fire_perimeters_dd83] F   WHERE F.geom.STGeometryType() = 'MultiPolygon' OR F.geom.STGeometryType() = 'Polygon'`

此示例查询筛选出几何图形类型空间数据，因为 Tableau 无法呈现 Microsoft SQL Server 连接的几何图形类型空间数据。您也可以选择其他空间类型。

#### 如果数据在 Tableau 中呈现太慢

`SELECT [Id], [OBJECTID], [fire_num], [year_], [acres], [fire_name], [unit_id], [Shape_Leng], [Shape_Area], [geom].Reduce(500) as SimpleGeom   FROM [Test_spatial_<username>].[dbo].[us_historic_fire_perimeters_dd83]   WHERE [geom].Reduce(500).STGeometryType() = 'MultiPolygon' OR [geom].Reduce(500).STGeometryType() = 'Polygon'`

此示例查询可以大大减小数据大小。（某些对象会缩小为点，这些对象将被丢弃。）

### 使用 RAWSQL

若要将 RAWSQL 用于空间数据，您可以使用 RAWSQL\_SPATIAL 或 RAWSQLAGG\_SPATIAL 函数创建一个计算字段。例如： 

`RAWSQL_SPATIAL("Select %1.STIntersection(%2.STBuffer(200))",[school_geom], [park_geom])`

此公式根据两个值的交集返回唯一的空间数据。

`RAWSQLAGG_SPATIAL("ST_ConvexHull(ST_Collect(%1))", [Geog])`

`RAWSQLAGG_SPATIAL("ST_ConcaveHull(ST_Collect(%1), %2, false)", [Geog], [ParameterValue])`

其中每一个都将返回所提供数据点周围的边界区域。ConcaveHull 是基于精度的最小边界区域，在此函数中是参数值。

有关将 RAWSQL 用于空间数据的详细信息，请参见[直通函数 (RAWSQL)](https://help.tableau.com/v0.0/pro/desktop/zh-cn/functions_functions_passthrough.htm)。有关如何创建计算字段的详细信息，请参见[创建计算字段](https://help.tableau.com/v0.0/pro/desktop/zh-cn/calculations_calculatedfields_create.htm#Create)。

> [!WARNING]
> 
> 注意：连接到 Oracle 时，RAWSQL 空间函数不可用。

**注意**：使用 PostgreSQL + PostGIS 时，在使用特定于 PostGIS 函数的 RAWSQL 时可能会导致错误。

## 空间连接疑难解答

### 性能问题

在使用包含大量记录的联接空间列时，可能会出现重复标记。这可能会导致性能变慢。

为了提高性能，请提取联接的数据源。有关详细信息，请参见[提取数据](https://help.tableau.com/v0.0/pro/desktop/zh-cn/extracting_data.htm)。

### Microsoft SQL Server 错误消息和解决方案

当空间表使用不支持的空间引用时

**错误消息：**

与 Microsoft SQL Server 数据源“<数据源名称>”通信时出错。​  
连接错误：Tableau 无法连接到数据源。  
\[Microsoft\]\[ODBC Driver 13 for SQL Server\]\[SQL Server\]操作数类型冲突: 几何图形与几何图形不兼容  
\[Microsoft\]\[ODBC Driver 13 for SQL Server\]\[SQL Server\]无法预定义语句。

**解决方案：**

- 将空间数据从 Microsoft SQL Server 导出为 Shapefile，并在 Tableau 中连接到该文件。空间文件连接将完成支持数千种投影的数据转换过程。
- 从 Microsoft SQL Server 中导出数据，并使用诸如 QGIS 或 ArcGIS 等 GIS 工具转换数据。然后将表重新载入 Microsoft SQL Server。​​

当空间表包括多种类型的空间对象时

错误消息：

无法完成操作  
空间运算生成了 Tableau 尚不支持的 MixedGeometry 或 MixedGeography。  
空间运算生成了 Tableau 尚不支持的 MixedGeometry 或 MixedGeography。

**解决方案：**

使用自定义 SQL 筛选数据。有关详细信息，请参见[如果看到有关混合数据类型的错误](#mix)自定义 SQL 示例。

在可视化项中聚合度量时

错误消息：

与 Microsoft SQL Server 数据源“<数据源名称>”通信时出错​  
连接错误：Tableau 无法连接到数据源。  
无法对包含聚合或子查询的表达式执行聚合函数。

**解决方案**：

在可视化项中解聚度量：选择“分析”，然后清除“聚合度量”。

### PostgreSQL + PostGIS、Oracle 和 Pivotal Greenplum + PostGIS 错误消息和解决方案

使用混合 SRID 并且某个 SRID 不受支持时

**错误消息：**

与 PostgreSQL 数据源“<数据源名称>”通信时出错​。  
连接错误：Tableau 无法连接到数据源。  
错误：对混合 SRID 几何图形的操作；  
执行查询时出错  
<数据源> 中的 <查询>  
错误：对混合 SRID 几何图形的操作；  
执行查询时出错  
SELECT ST\_ForceCollection(ST\_Collect("mixed\_SRID\_geography"."location"::geometry)) AS "clct:location:nk"  
FROM "public"."mixed\_SRID\_geography" "mixed\_SRID\_geography"HAVING (COUNT(1) > 0)

解决方案：

在可视化项中解聚度量：选择“分析”，然后清除“聚合度量”。这将消除错误消息和不支持 SRID 的数据。

当空间表使用不支持的空间引用时

在 PostgreSQL + PostGIS 中，您可以连接到包含不支持 SRID 的表，但“Geometry”（几何图形）列将显示为“Unknown”（未知）。

**解决方案：**

- 将空间数据从 PostgreSQL + PostGIS 导出为 Shapefile，并在 Tableau 中连接到该数据。空间文件连接将完成支持数千种投影的数据转换过程。
- 从 PostgreSQL + PostGIS 中导出数据，并使用诸如 QGIS 或 ArcGIS 等 GIS 工具转换数据。然后将表重新载入 PostgreSQL + PostGIS。​​

查询结果超出 1GB 限制时

**错误消息：**

错误：数组大小超出允许的最大值 (1073741823)；执行查询时出错  
SELECT ST\_Collect(geom) FROM <data source>

**解决方案**：

重写计算以提高效率。请参见[Tableau 中创建计算的最佳做法](https://help.tableau.com/v0.0/pro/desktop/zh-cn/calculations_calculatedfields_bestpractices.htm)或[创建高效的计算](https://help.tableau.com/v0.0/pro/desktop/zh-cn/perf_efficient_calcs.htm)。

## 示例 - 依据 Microsoft SQL Server 空间数据构建地图

以下示例演示如何创建下面的地图，该地图显示位于华盛顿州西雅图各个公园 600 米范围内的学校。

![西雅图一所学校 400 米范围内公共空间的地图。](/tableau/next/zh-cn/pro/desktop/zh-cn/Img/maps_sql10.png)

此示例使用一个名为 TestSpatial 的 Microsoft SQL Server 数据库连接。将使用此数据库中的以下各表：

- seattle\_schools
- seattle\_public\_space

### 步骤 1：连接

1. 打开 Tableau Desktop 并连接到 Microsoft SQL Server。
2. 在“数据源”页面的左侧窗格中，将“新建自定义 SQL”拖到画布上。
3. 在出现的“编辑自定义 SQL”对话框中键入或粘贴查询。
    
    此示例使用以下查询：
    
    SELECT S.\[name\] as SchoolName, P.\[name\] as PubSpaceName, S.geog\_schools.STBuffer(<Parameters.Radius>) as Geog\_School, P.geog\_pub\_space as Geog\_Pub\_Space FROM TestSpatial.dbo.seattle\_public\_schools S FULL JOIN TestSpatial.dbo.seattle\_public\_space P ON S.geog\_schools.STBuffer(<Parameters.Radius>).STIntersects(P.geog\_pub\_space) = 1
    
    **注意**：此示例引用名为“Radius”的参数。有关详细信息，请参见[在自定义 SQL 查询中使用参数](https://help.tableau.com/v0.0/pro/desktop/zh-cn/customsql.htm#parameters)。
    
    此查询的结果如下所示：
    
    ![具有两个应用了地理角色的字段的“数据源”窗格。](/tableau/next/zh-cn/pro/desktop/zh-cn/Img/maps_sql3.png)

### 步骤 2：构建地图

1. 转到一个新工作表。
2. 在**“数据”**窗格中，双击某个空间字段。
    
    此示例中使用**“Geog\_School”**。双击后，该字段将自动添加至“标记”卡上的“详细信息”，并且会创建一个地图视图。
    
    ![西雅图地图，其中的数据点以点表示。](/tableau/next/zh-cn/pro/desktop/zh-cn/Img/maps_sql4.png)
3. 从**“数据”**窗格中，将维度字段拖到“标记”卡上的“标签”。此示例中使用“**School Name**”（学校名称）。
4. 选择“分析”\>“创建计算字段”。
5. 在打开的计算编辑器中，执行以下操作：
    
    - 为计算字段命名。在此示例中，计算字段称为“Intersection”（交集）。
    - 输入 RAWSQL 公式。此示例使用以下公式：
        
        RAWSQL\_SPATIAL ("Select %1.STIntersection(%2)", \[Geog\_School\], \[Geog\_Pub\_Space\])
        
        此公式根据两个几何图形的交集返回唯一的空间数据。
    - 完成后，单击“确定”。
6. 选择“分析”，然后清除“聚合度量”。
7. 从**“数据”**窗格中，将新的计算字段（本例中为**“intersection”**（交集））拖到工作表上的新层。
    
    ![将地理字段拖到已包含地图的画布上时出现的“添加标记层”框。](/tableau/next/zh-cn/pro/desktop/zh-cn/Img/maps_sql6.png)  
    地图使用来自“intersection”（交集）字段的新多边形图层进行更新。由于 RAWSQL 公式的原因，标记为唯一的空间形状。  
    ![西雅图蒙特莱克街区的地图，显示了各种公园、街道和建筑物。](/tableau/next/zh-cn/pro/desktop/zh-cn/Img/maps_sql11.png)
8. 从**“数据”**窗格中，将维度字段拖到“标记”卡上的“详细信息”。这会将标记解聚。
    
    此示例中使用维度“PubSpaceName”（公共空间名称）。
9. 从**“数据”**窗格中，将同一维度字段拖到“标记”卡上的“颜色”。
    
    在此示例中，每个公共空间现在分配有一种颜色。
    
    ![西雅图地图，标出了志愿者公园的位置以及周围的街道和建筑。](/tableau/next/zh-cn/pro/desktop/zh-cn/Img/maps_sql7.png)

1. 设置地图的格式。有关详细信息，请参见[自定义地图的外观](https://help.tableau.com/v0.0/pro/desktop/zh-cn/maps_options.htm)。
    
    在此示例，将应用以下格式设置：
    
    - “School buffer”（学校缓冲区）标记 (Geog\_School) 显示为灰色。
    - “School Name”（学校名称）标记标签显示为白色。
    - 地图背景样式设置为深色。
    - 街道和高速公路层显示在背景地图上。
    
    地图现在已完成。
    
    ![华盛顿州西雅图的学校地图，带有交互式面板。](/tableau/next/zh-cn/pro/desktop/zh-cn/Img/maps_sql9.png)

## 另请参见

[依据空间文件创建 Tableau 地图](https://help.tableau.com/v0.0/pro/desktop/zh-cn/maps_shapefiles.htm)

[连接到自定义 SQL 查询](https://help.tableau.com/v0.0/pro/desktop/zh-cn/customsql.htm)

[直通函数 (RAWSQL)](https://help.tableau.com/v0.0/pro/desktop/zh-cn/functions_functions_passthrough.htm)

[Tableau 中的计算入门指南](https://help.tableau.com/v0.0/pro/desktop/zh-cn/calculations_calculatedfields_create.htm)

[使用从 Shapefile 或 GeoJSON 导入的 KML 或 SQL 空间数据，空间连接速度较慢并返回反向结果](https://kb.tableau.com/articles/issue/spatial-join-slow-and-returns-inverted-results-using-kml-or-sql-spatial-data-imported-from-shapefile-or-geojson?lang=it-it)