狮身人面像搜索:有没有一种方法可以在一条路线的几英里内找到结果,即折线而不是多边形

问题描述 投票:1回答:1

我想在Sphinx Search中搜索距“折线”“ X”英里以内的记录,记录可以位于折线的两侧。我有一组地理编码,可以形成一条路线。

$polylineLatLon = array("48.1390965,11.580255","48.2617271,11.6472244","48.3885849,11.5972817","48.5191226,11.5829265","48.6465704,11.516","48.773632,11.4611113","48.9037728,11.4703166","49.0096128,11.3544774","49.1298187,11.272155","49.2569017,11.2146807","49.3872571,11.2021279","49.5046949,11.2919927","49.6166182,11.3960946","49.7263312,11.5053892","49.8565686,11.51806","49.9767852,11.606766","50.0952959,11.6940558","50.2140534,11.7813241","50.3446984,11.7877614","50.4762554,11.8022454","50.6064391,11.791023","50.7318807,11.8482506","50.8638132,11.8523812","50.9891474,11.9091797","51.1166811,11.9561183","51.2372088,12.0594156","51.3430381,12.1846855","51.4732111,12.2154129","51.6025257,12.183516","51.7333531,12.2172689","51.8452442,12.3273146","51.9514704,12.4555349","52.03493,12.6191926","52.1380019,12.7586353","52.227931,12.913034","52.3074102,13.0885363","52.4209106,13.1959963","52.5143051,13.3479595","52.5234738,13.4115041");

我尝试了2种方法,但均失败。

第一种方法:

$cl = new SphinxClient;
$cl->SetLimits(0, 20);
$cl->SetMatchMode(SPH_MATCH_EXTENDED);

foreach($polylineLatLon as $singPoly){

     $singPolyExplode = explode(",",$singPoly);

     $latRad = Deg2Rad($singPolyExplode[0]);

     $LonRad = Deg2Rad($singPolyExplode[1]);

     $cl->SetGeoAnchor('latitude', 'longitude', $latRad,$LonRad);

     $cl->AddQuery("", $indexerName);
}
$result =$cl->runQueries();

问题使用这种方法,它将获取每个地址解析附近的记录。不是完整的路径。此外,使用折线地理编码为每条记录计算距离也将花费大量时间。因此,它不是一种优化的方法。

第二种方法:

$cl = new SphinxClient;
$cl->SetLimits(0, 2000);
$cl->SetMatchMode(SPH_MATCH_EXTENDED);
$cl->SetSelect("*, CONTAINS(GEOPOLY2D(48.1390965,11.580255,48.2617271,11.6472244,48.3885849,11.5972817,48.5191226,11.5829265,48.6465704,11.516,48.773632,11.4611113,48.9037728,11.4703166,49.0096128,11.3544774,49.1298187,11.272155,49.2569017,11.2146807,49.3872571,11.2021279,49.5046949,11.2919927,49.6166182,11.3960946,49.7263312,11.5053892,49.8565686,11.51806,49.9767852,11.606766,50.0952959,11.6940558,50.2140534,11.7813241,50.3446984,11.7877614,50.4762554,11.8022454,50.6064391,11.791023,50.7318807,11.8482506,50.8638132,11.8523812,50.9891474,11.9091797,51.1166811,11.9561183,51.2372088,12.0594156,51.3430381,12.1846855,51.4732111,12.2154129,51.6025257,12.183516,51.7333531,12.2172689,51.8452442,12.3273146,51.9514704,12.4555349,52.03493,12.6191926,52.1380019,12.7586353,52.227931,12.913034,52.3074102,13.0885363,52.4209106,13.1959963,52.5143051,13.3479595,52.5234738,13.4115041), latitude_deg,longitude_deg) as inside");
$cl->setFilter("inside",array(1));
$result = $cl->Query("", $indexer);

问题使用这种方法的原因是记录仅在多边形内提取。但是,我想在距路线几英里的范围内在折线的两侧记录。

enter image description here

php sphinx
1个回答
0
投票

在最一般的意义上,需要“缓冲”折线,以将其变成多边形:)即创建一个多边形,该多边形围绕折线X距离内的区域。

Buffer是众所周知的GIS操作。 ...我一点都不知道一个简单的PHP库就能做到(Sphinx没有一个!)

Google还创建了“ Route Boxer”算法,该算法采用折线并将其变成一系列不重叠的矩形。某种简化的(更近似!)系统。即使狮身人面像可以执行这些操作,但查找一系列框的结果也比完整面查询更简单。有PHP库:https://github.com/bazo/route-boxer

© www.soinside.com 2019 - 2024. All rights reserved.