我感兴趣的是制作一个网站,它将存储多个位置,并需要能够根据用户的查询找到它们。类似的网站,如Yelp,Zomato,Zillow等。我喜欢的技术栈是PHP/MySQL。
尽管如此,我还有几个相关的问题。给出一个位置的数据库以及它们的纬度/经度坐标.
发布于 2017-04-04 13:43:56
这将有助于你的第一点。
我使用此查询按起点距离搜索数据库中的属性。起点是经度和纬度,$coordX
和$coordY
。我是通过在Google上进行地理代码查找获得这些信息的:
SELECT properties.*,
(
( ACOS(SIN(".$coordX." * PI() / 180) *
SIN(coordX * PI() / 180) + COS(".$coordX." * PI() / 180) *
COS(coordX * PI() / 180) * COS((".$coordY." - coordY) *
PI() / 180)) * 180 / PI()) * 60 * 1.1515
)
AS distance
FROM properties
order by distance
在我的表中,我将单个属性坐标的坐标存储在coordX
和coordY
列中。
发布于 2017-04-04 13:50:40
这里是MySQL函数,它将取两个纬度/经度对,并给出两个点之间以度为单位的距离。它使用Haversine公式来计算距离。由于地球不是一个完美的球体,在两极和赤道附近有一些误差。
haversine
( lat1浮点数、lon1浮点数、lat2浮点数、lon2浮点数)不返回SQL确定性注释‘返回地球上两个已知纬度点和经度之间的距离。得到英里数,乘以3961,公里乘以6373‘开始返回度(ACOS(辐射(Lat1))*COS(弧形(Lat2))*COS(半径(Lon2)-弧形(Lon1))+SIN(弧形(Lat1))*SIN(弧形(Lat2);
划界者;使用浮点数(10,6)将列添加到您的纬度和经度地址表中。在保存记录时,编写一个php脚本来查找lat/long。
然后,您可以对表进行选择,以获得具有距离的地址列表。您甚至可以根据距离对结果进行排序,或者将结果限制在来自参考位置的某个半径范围内。
SELECT
`street`,
`city`,
`state`,
`zip`,
(haversine($ref_location_lat,$ref_location_long,`lat`,`long) * 3961) as `distance`
FROM `address_table`
WHERE (haversine($ref_location_lat,$ref_location_long,`lat`,`long) * 3961) < 300 // Example for limiting returned records to a raduis of 300 miles.
ORDER BY haversine($ref_location_lat,$ref_location_long,`lat`,`long) DESC; // Don't need actual distance for sorting, just relative distance.
https://stackoverflow.com/questions/43218020
复制