您可以使用存储在数据库中的空间列在 Tableau 中构建地图可视化项。
Tableau 支持使用以下连接器直接连接到空间数据:
- Microsoft SQL Server
- PostgreSQL + PostGIS
- Pivotal Greenplum + PostGIS
- Oracle
有关使用这些连接器的信息,请参见Microsoft SQL Server、PostgreSQL、Pivotal Greenplum Database或Oracle连接器示例。
支持的空间数据和 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 并连接到数据。有关如何使用支持的连接器连接到数据的详细信息,请参见Microsoft SQL Server、PostgreSQL、Oracle或Pivotal Greenplum Database连接器示例。
-
在“数据源”页面左侧窗格中的“表”下,将一个包含空间数据的表拖到画布上。
空间列显示的名称与他们在数据库中的名称相同。
现在即可使用空间数据在 Tableau 中构建地图。有关如何依据空间文件创建地图的详细信息,请参见依据空间数据构建地图视图。
使用自定义 SQL 和 RAWSQL 执行高级空间分析
连接到自定义 SQL 查询
- 打开 Tableau 并连接到数据库。
-
在“数据源”页面的左侧窗格中,将“新建自定义 SQL”拖到画布上。
-
在出现的“编辑自定义 SQL”对话框中键入或粘贴您的查询。有关可用于空间数据的自定义 SQL 的示例,请参见自定义 SQL 查询示例。
-
完成后,单击“确定”。
有关详细信息,请参见连接到自定义 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 错误消息和解决方案
错误消息:
与 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。
错误消息:
错误:数组大小超出允许的最大值 (1073741823);执行查询时出错
SELECT ST_Collect(geom) FROM <data source>
解决方案:
重写计算以提高效率。请参见Tableau 中创建计算的最佳做法或创建高效的计算。
示例 - 依据 Microsoft SQL Server 空间数据构建地图
以下示例演示如何创建下面的地图,该地图显示位于华盛顿州西雅图各个公园 600 米范围内的学校。
此示例使用一个名为 TestSpatial 的 Microsoft SQL Server 数据库连接。将使用此数据库中的以下各表:
- seattleelementaryschools
- allseattleparks
步骤 1:连接
-
打开 Tableau Desktop 并连接到 Microsoft SQL Server。
-
在“数据源”页面的左侧窗格中,将“新建自定义 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”的参数。有关详细信息,请参见在自定义 SQL 查询中使用参数。
此查询的结果如下所示:
步骤 2:构建地图
-
转到一个新工作表。
-
在“数据”窗格中,双击某个空间字段。
此示例中使用“school_geom”。双击后,该字段将自动添加至“标记”卡上的“详细信息”,并且会创建一个地图视图。
-
从“数据”窗格中,将维度拖到“标记”卡上的“标签”。此示例中使用“School Name”(学校名称)。
-
在“行”功能区上,按住 Ctrl 单击(在 Mac 上按住 Command 单击)并将“纬度(生成)”向右拖动。这将复制字段。
一个重复的地图将出现在第一个地图下,并且“标记”卡将更新为包含两个“纬度(生成)”选项卡。顶部的选项卡表示顶部的地图,底部的选项卡表示底部的地图。
-
在“标记”卡上,单击底部的“纬度(生成)”选项卡,并通过将字段拖回到“数据”窗格来移除字段。
底部地图将更新为空白地图。
-
选择“分析”>“创建计算字段”。
-
在打开的计算编辑器中,执行以下操作:
-
为计算字段命名。在此示例中,计算字段称为“Intersection”(交集)。
-
输入 RAWSQL 公式。此示例使用以下公式:
RAWSQL_SPATIAL("Select %1.STIntersection(%2.STBuffer(200))",[school_geom], [park_geom])
此公式根据两个值的交集返回唯一的空间数据。
-
完成后,单击“确定”。
-
-
选择“分析”,然后清除“聚合度量”。
-
从“数据”窗格中,将新的计算字段(本例中为“Intersection”)拖到“标记”卡上的“详细信息”。
底部地图将更新为包含新标记。请注意,由于 RAWSQL 公式的原因,标记为唯一的空间形状。
-
从“数据”窗格中,将维度拖到“标记”卡上的“详细信息”。这会将标记解聚。
此示例中使用维度“ParkName”(公园名称)。
-
从“数据”窗格中,将同一维度拖到“标记”卡上的“颜色”。
在此示例中,每个公园现在分配有一种颜色。
-
在“行”功能区上,右键单击右侧的“纬度(生成)”字段,并选择“双轴”。
地图现在将合并,数据将分层。有关详细信息,请参见在 Tableau 中创建双轴(分层)地图。
-
设置地图的格式。有关详细信息,请参见自定义地图的外观。
在此示例,将应用以下格式设置:
-
“School Name”(学校名称)标记显示为灰色。
-
“School Name”(学校名称)标记标签显示为橙色。
-
地图背景样式设置为深色。
-
街道和高速公路层显示在背景地图上。
地图现在已完成。
-