我正在开发一个“社交”地理感知应用程序,百万美元的问题是我如何列出一组“我的位置”在“X英里内”的项目,因为有数百万个应用程序在做我惊讶地发现,只有Google Maps API有免费的网络服务,更糟糕的是,只有在谷歌地图中使用它才支持。那么我必须开发自己的距离计算器吗?是否有任何免费/付费服务,我将至少将地址转换为XY坐标?
我确信有一个行业标准解决方案(免费或商业),但我还没找到它
答案 0 :(得分:4)
如果你正在使用SQL(你没说)......我想我是从NerdDinner项目中复制过的:
ALTER FUNCTION [dbo].[DistanceBetween] (@Lat1 as real,
@Long1 as real, @Lat2 as real, @Long2 as real)
RETURNS real
AS
BEGIN
DECLARE @dLat1InRad as float(53);
SET @dLat1InRad = @Lat1 * (PI()/180.0);
DECLARE @dLong1InRad as float(53);
SET @dLong1InRad = @Long1 * (PI()/180.0);
DECLARE @dLat2InRad as float(53);
SET @dLat2InRad = @Lat2 * (PI()/180.0);
DECLARE @dLong2InRad as float(53);
SET @dLong2InRad = @Long2 * (PI()/180.0);
DECLARE @dLongitude as float(53);
SET @dLongitude = @dLong2InRad - @dLong1InRad;
DECLARE @dLatitude as float(53);
SET @dLatitude = @dLat2InRad - @dLat1InRad;
/* Intermediate result a. */
DECLARE @a as float(53);
SET @a = SQUARE (SIN (@dLatitude / 2.0)) + COS (@dLat1InRad)
* COS (@dLat2InRad)
* SQUARE(SIN (@dLongitude / 2.0));
/* Intermediate result c (great circle distance in Radians). */
DECLARE @c as real;
SET @c = 2.0 * ATN2 (SQRT (@a), SQRT (1.0 - @a));
DECLARE @kEarthRadius as real;
/* SET kEarthRadius = 3956.0 miles */
SET @kEarthRadius = 6376.5; /* kms */
DECLARE @dDistance as real;
SET @dDistance = @kEarthRadius * @c;
return (@dDistance);
END
ALTER FUNCTION [dbo].[NearestPeople]
(
@lat real,
@long real,
@maxdist real
)
RETURNS TABLE
AS
RETURN
SELECT Person.ID
FROM Person
WHERE dbo.DistanceBetween(@lat, @long, Latitude, Longitude) < @maxdist
然后我在C#中使用服务器中的这些SQL函数:
public IQueryable<Person> FindNearbyPeople(float latitude, float longitude, float maxdistance)
{
var people = from person in FindAllPeople()
join i in db.NearestPeople(latitude, longitude, maxdistance)
on person.ID equals i.ID
select person;
return people;
}
告诉我谁(在这种情况下,人)在最大距离内离我很近。
这是免费版。我认为SQL Server 2008可以使用地理包执行此操作
答案 1 :(得分:4)
实际上,Google确实可以在服务器端使用web services来实现此目的。
首先,您需要使用Geocoding API将地址转换为纬度/经度坐标对。然后,您可以使用您认为合适的那些(例如,如果您要存储这些数据库,则使用您自己的数据库)
如果您要查找的附近商品是Google可能已经知道的世界上的实际地点,您可以尝试Google的新Places API,它可以在一定范围内为您提供结果。
你应该注意从纬度/经度坐标到距离的转换确实需要一些数学,但我认为最好在本地完成(在运行你的应用程序的服务器上),而不是养殖到某些外部服务器,因为它是仅数学。 谷歌搜索产生了this。
答案 2 :(得分:4)
如果你很幸运并且你使用的mysql或postgresql都是支持空间的数据库,你可以对它们执行空间查询。对于mysql,有spatial extensions,对于postgresql,有postgis。
如果您决定使用手册,请查看此question进行抬头。我也不明白google如何帮助您,因为您在半径范围内查找您的数据而不是谷歌的地方。
干杯
答案 3 :(得分:3)
你想要“As Crow Flies”(直线)距离,还是行驶距离/时间?
Mapquest的API似乎更容易,因为您可以使用查询字符串。
另一种选择是geocoder.us(或.ca,如果加拿大人)