Dynamics crm FetchXML-按距离进行地理编码距离搜索
我有一个实体,它有纬度和经度字段 现在我有一个地址,我知道这个地址的纬度和经度,我想检索3英里内的记录Dynamics crm FetchXML-按距离进行地理编码距离搜索,dynamics-crm,geocoding,dynamics-crm-2011,fetchxml,Dynamics Crm,Geocoding,Dynamics Crm 2011,Fetchxml,我有一个实体,它有纬度和经度字段 现在我有一个地址,我知道这个地址的纬度和经度,我想检索3英里内的记录 如何使用FetchXML实现这一点?您无法通过FetchXML直接实现这一点,因为地理编码并不是一项功能 这意味着你需要开始用手滚动一些不容易的东西。对您需要做的事情有一个很好的概述(即使语言与您可能使用的CRM不同) 一种选择可能是放宽您的要求,只需使用FetchXml查找经度+/-1.5英里和纬度+/-1.5英里的记录(当然,它查询的是形状像正方形而不是半径的区域) 如果您需要更加严格,您
如何使用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]
选择id,X(gm_-coor)作为纬度,Y(gm_-coor)作为经度,
ATAN2(
SQRT(
功率(COS(弧度)*
SIN(弧度(Y(gm_coor)),2)+
功率(COS(弧度(X(gm_coor)))*SIN(弧度(uu LAT_uu))-
SIN(弧度(X(gm_-coor))*COS(弧度(u-LAT_u))*
COS(弧度(Y(gm_coor)-(2)),
(SIN(弧度)(X(gm_coor)))SIN(弧度(LAT))+
COS(弧度X(gm_-coor))*COS(弧度(u-LAT_u))*
弧度
)*6372.795作为距离
从地理编码
距离小于[公里范围]
我可以马上想到两个选择
1) 使用SQL中过滤的视图并计算大圆距离公式。这是最干净的方式,但不是取回
2) 获取所需点lat/lng+/-.02范围内的所有结果。然后使用大圆距离公式(和javascript)磨练您想要的项目。因此,在本例中,Fetch将返回一些额外的结果(但将排除大多数),然后JavaScript将过滤剩余的结果
选项#2效果很好,但它是一种2次通过的方法
也可以看到这一点: