我们有一个地理定位点,其纬度为28.638753,经度为77.073803
我们有一个区域表,其中包含列ID,名称和点类型的“位置”(具有经度和纬度)。我们要列出此给定点3公里范围内的所有区域(纬度:28.638753,经度:77.073803)。我们已经为其编写了以下查询。
SELECT *
FROM areas
WHERE MBRContains
(
LineString
(
Point (
28.638753 + 3 / ( 111.1 / COS(RADIANS(77.073803))),
77.073803 + 3 / 111.1
),
Point (
28.638753 - 3 / ( 111.1 / COS(RADIANS(77.073803))),
77.073803 - 3 / 111.1
)
),
position
);
这会返回3公里(纬度:28.638753,经度:77.073803)区域,但我还想要:
Here是小提琴链接。在此示例中,给定的点最接近A,最远的是C,但显示顺序为A,C,B。如何按距给定点(即A,B,C)的距离的降序排序?
一种解决方法是按照here的建议进行这样的查询:
SELECT id, name, ( 3959 * acos( cos( radians(28.638753) ) * cos( radians( Lattitude ) ) * cos( radians( Longitude ) - radians(77.073803) ) + sin( radians(28.638753) ) * sin( radians( Lattitude ) ) ) ) AS distance
FROM areas
HAVING distance < 3
ORDER BY distance asc;
问题在于查询的性能。这需要太多时间。