Web 服务和表值函数
表值函数的一个有趣功能是从 Web 服务中提取数据的能力。这可用于创建非常规的报表。我将说明如何在表值函数中使用 Microsoft MapPoint Web 服务,并将它与 AdventureWorks 数据库中的数据联接,从而将空间数据显示在地图上和显示在报表中。
使用 MapPoint Web 服务:
您必须先从 Microsoft 获得免费的开发人员帐户,然后才能开始按照 MapPoint Web 服务进行开发。您可以访问 MapPoint Web 服务客户服务网站,从中获取一个帐户。开始根据该 Web 服务进行开发之前,可以从一个好地方获取信息,即 MapPoint Web 服务 SDK 入门。
您需要使用 Visual Studio 将 Web 引用添加到您的项目中,该引用指向 MapPoint 暂存服务器上的 .wsdl 文件。有关为 MapPoint Web 服务配置 Web 引用的详细信息,请参阅访问 MapPoint Web 服务SOAP API。
MapPoint Web 服务提供四种服务,每种服务都有其自己的 SOAP 端点:
• 公共服务提供可供其他服务使用的功能。此服务用于检索元数据和用于实用功能。
• 查找服务可用于搜索位置,查找某一地址的经度和纬度(“地理编码”),以及查找某位置附近的兴趣点。
• 路线服务指示一个位置到另一个位置的行车路线。
• 呈现服务可用于利用位置和路线信息创建地图图像。
MapPoint Web 服务表值函数:
最后,我希望我的表值函数使用 MapPoint Web 服务来执行以下任务:
• 使用查找服务来查找 AdventureWorks 自行车店的经度和纬度。
• 使用查找服务来查找距此经度和纬度最近的五台自动柜员机 (ATM)。
• 使用呈现服务来查找从该商店到 ATM 的路线。
• 使用呈现服务将此路线显示在地图上。
首先,我必须定义一个称为 GetProximity 的表值函数。以下 Transact-SQL 代码显示我的表值函数的签名:
CREATE FUNCTION GetProximity(@city nvarchar(200), @state nvarchar(2),
@count int, @entityTypeName nvarchar(200))
RETURNS TABLE
(HitName nvarchar(200), HitAddress nvarchar(200), MapImage
varbinary(max)) |
GetProximity 使用城市名和两位数的州代码来代表初始位置。它返回实体数,和要搜索的实体类型名。它会搜索 n 个最近的实体,其中,n 由计算参数指定,实体类型由 entityTypeName 参数指定。它会返回一个表和一幅地图(二进制文件图像),表中包含名称列、地址列,地图中包含每个实体的路线。
C# 方法签名如下所示:
public static IEnumerable
InitMap(string city, string state, int count,
string entityTypeName)
public static void FillRow(Object obj,
out SQLChars name, out SQLChars
address, out SQLBinary map) |
请注意,nvarchar Transact-SQL 数据类型映射到 SQLChars .net Framework 数据类型,而 varbinary Transact-SQL 数据类型映射到 SQLBinary .NET Framework 数据类型。有关数据类型之间的映射的完整列表,请参阅 System.Data.SQLTypes 命名空间的文档。
在 InitMap 方法中,我将城市和州转换成经度和纬度。接着,我找到了与此坐标接近的所有实体。最后,我找到了初始位置和找到的实体之间的行车路线。返回值是封装有行车路线的一组 Route 对象。