我有一个具有纬度和经度字段的实体。
现在我有一个地址,我知道这个地址的经纬度,我想检索 3 英里内的记录。
如何使用 FetchXML 做到这一点?
我有一个具有纬度和经度字段的实体。
现在我有一个地址,我知道这个地址的经纬度,我想检索 3 英里内的记录。
如何使用 FetchXML 做到这一点?
您将无法直接通过 FetchXml 执行此操作,因为地理编码不作为一项功能提供。
这意味着你需要开始用手滚动一些东西,这并不容易。这个网站很好地概述了您需要做什么(即使语言与您可能用于 CRM 的语言不同)。
一种选择可能是放宽您的要求,只使用 FetchXml 来查找经度 +/- 1.5 英里和纬度 +/- 1.5 英里的记录(这当然会查询形状像正方形而不是半径的区域)。
如果您需要更严格,您可以尝试重写以下MySQL(即不是 MSSQL!)查询并将其与某种 QueryExpression 一起使用?因此,例如,一个查询表达式来确定一个粗略的数据子集,如上所述(例如,经度和纬度在中心点 1.5 英里处),然后在返回这些结果后,为每个计算它是否在所需的半径范围内...
SELECT id, X(gm_coor) AS latitude, Y(gm_coor) AS longitude,
ATAN2(
SQRT(
POW(COS(RADIANS(__LAT__)) *
SIN(RADIANS(Y(gm_coor) - __LNG__)), 2) +
POW(COS(RADIANS(X(gm_coor))) * SIN(RADIANS(__LAT__)) -
SIN(RADIANS(X(gm_coor))) * COS(RADIANS(__LAT__)) *
COS(RADIANS(Y(gm_coor) - __LNG__)), 2)),
(SIN(RADIANS(X(gm_coor))) * SIN(RADIANS(__LAT__)) +
COS(RADIANS(X(gm_coor))) * COS(RADIANS(__LAT__)) *
COS(RADIANS(Y(gm_coor) - __LNG__)))
) * 6372.795 AS distance
FROM geocoded
HAVING distance < [RANGE IN KILOMETRES]
我可以想到两个选项
1)使用SQL中的过滤视图并计算大圆距离公式。这是最干净的方式,但不是获取。
2) 获取所需点的 lat/lng +/- .02 范围内的所有结果。然后使用大圆距离公式(和 javascript)来磨练你想要的项目。所以在这种情况下,Fetch 将返回一些额外的结果(但会排除大多数),然后 JavaScript 将过滤剩余的结果。
选项 #2 效果很好,但是是 2 次通过的方法。