您可以使用存储在数据库中的空间列在 Tableau 中构建地图可视化项。

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

  • Microsoft SQL Server
  • PostgreSQL + PostGIS
  • Pivotal Greenplum + PostGIS
  • Oracle

有关使用这些连接器的信息,请参见Microsoft SQL ServerPostgreSQLPivotal Greenplum DatabaseOracle连接器示例。

支持的空间数据和 SRID

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

PostgreSQL + PostGISOracle 以及 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 支持使用这些连接器进行实时连接和数据提取连接。

连接到空间列

  1. 打开 Tableau 并连接到数据。有关如何使用支持的连接器连接到数据的详细信息,请参见Microsoft SQL ServerPostgreSQLOraclePivotal Greenplum Database连接器示例。
  2. 在“数据源”页面左侧窗格中的“表”下,将一个包含空间数据的表拖到画布上。

    空间列显示的名称与他们在数据库中的名称相同。

    现在即可使用空间数据在 Tableau 中构建地图。有关如何依据空间文件创建地图的详细信息,请参见依据空间数据构建地图视图

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

连接到自定义 SQL 查询

  1. 打开 Tableau 并连接到数据库。
  2. 在“数据源”页面的左侧窗格中,将“新建自定义 SQL”拖到画布上。

  3. 在出现的“编辑自定义 SQL”对话框中键入或粘贴您的查询。有关可用于空间数据的自定义 SQL 的示例,请参见自定义 SQL 查询示例

  4. 完成后,单击“确定”

有关详细信息,请参见连接到自定义 SQL 查询

自定义 SQL 查询示例

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

如果您的数据有两组点(例如学校和公园),并且您想要显示它们的相交位置:

SELECT S.[common nam] as SchoolName, P.[common nam] as ParkName, S.geom.STBuffer(<Parameters.Radius>) as school_geom, P.geom as park_geom FROM TestSpatial.dbo.seattleelementaryschools S LEFT JOIN TestSpatial.dbo.allseattleparks P on S.geom.STBuffer(<Parameters.Radius>).STIntersects(P.geom) = 1

此示例查询将为公园在学校半径距离(米)内的每种情况生成一行。查询结果在数据网格中如下所示:

注意:此示例引用名为“Radius”的参数。该参数测量距离(米),并具有以下设置:

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

有关详细信息,请参见在自定义 SQL 查询中使用参数

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

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 米范围内的数据。像第一个示例中使用的参数一样,半径可以是参数。

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

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)。有关如何创建计算字段的详细信息,请参见创建计算字段

注意:连接到 Oracle 时,RAWSQL 空间函数不可用。

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

空间连接疑难解答

性能问题

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

为了提高性能,请提取联接的数据源。有关详细信息,请参见提取数据

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 筛选数据。有关详细信息,请参见如果看到有关混合数据类型的错误自定义 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 中创建计算的最佳做法创建高效的计算

 

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

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

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

  • seattleelementaryschools
  • allseattleparks

步骤 1:连接

  1. 打开 Tableau Desktop 并连接到 Microsoft SQL Server。

  2. 在“数据源”页面的左侧窗格中,将“新建自定义 SQL”拖到画布上。

  3. 在出现的“编辑自定义 SQL”对话框中键入或粘贴查询。

    此示例使用以下查询:

    SELECT S.[common nam] as SchoolName, P.[common nam] as ParkName, S.geom.STBuffer(<Parameters.Radius>) as school_geom, P.geom as park_geom FROM TestSpatial.dbo.seattleelementaryschools S LEFT JOIN TestSpatial.dbo.allseattleparks P on S.geom.STBuffer(<Parameters.Radius>).STIntersects(P.geom) = 1

    注意:此示例引用名为“Radius”的参数。有关详细信息,请参见在自定义 SQL 查询中使用参数

    此查询的结果如下所示:

步骤 2:构建地图

  1. 转到一个新工作表。

  2. “数据”窗格中,双击某个空间字段。

    此示例中使用“school_geom”。双击后,该字段将自动添加至“标记”卡上的“详细信息”,并且会创建一个地图视图。

  3. “数据”窗格中,将维度拖到“标记”卡上的“标签”。此示例中使用“School Name”(学校名称)。

  4. 在“行”功能区上,按住 Ctrl 单击(在 Mac 上按住 Command 单击)并将“纬度(生成)”向右拖动。这将复制字段。

    一个重复的地图将出现在第一个地图下,并且“标记”卡将更新为包含两个“纬度(生成)”选项卡。顶部的选项卡表示顶部的地图,底部的选项卡表示底部的地图。

  5. 在“标记”卡上,单击底部的“纬度(生成)”选项卡,并通过将字段拖回到“数据”窗格来移除字段。

    底部地图将更新为空白地图。

  6. 选择“分析”>“创建计算字段”

  7. 在打开的计算编辑器中,执行以下操作:

    • 为计算字段命名。在此示例中,计算字段称为“Intersection”(交集)。

    • 输入 RAWSQL 公式。此示例使用以下公式:

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

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

    • 完成后,单击“确定”

  8. 选择“分析”,然后清除“聚合度量”

  9. 从“数据”窗格中,将新的计算字段(本例中为“Intersection”)拖到“标记”卡上的“详细信息”

    底部地图将更新为包含新标记。请注意,由于 RAWSQL 公式的原因,标记为唯一的空间形状。

  10. “数据”窗格中,将维度拖到“标记”卡上的“详细信息”。这会将标记解聚。

    此示例中使用维度“ParkName”(公园名称)。

  11. “数据”窗格中,将同一维度拖到“标记”卡上的“颜色”

    在此示例中,每个公园现在分配有一种颜色。

  12. 在“行”功能区上,右键单击右侧的“纬度(生成)”字段,并选择“双轴”

    地图现在将合并,数据将分层。有关详细信息,请参见在 Tableau 中创建双轴(分层)地图

  13. 设置地图的格式。有关详细信息,请参见自定义地图的外观

    在此示例,将应用以下格式设置:

    • “School Name”(学校名称)标记显示为灰色。

    • “School Name”(学校名称)标记标签显示为橙色。

    • 地图背景样式设置为深色。

    • 街道和高速公路层显示在背景地图上。

    地图现在已完成。

另请参见

依据空间文件创建 Tableau 地图

连接到自定义 SQL 查询

直通函数 (RAWSQL)

Tableau 中的计算入门指南

感谢您的反馈!