如何找到两个地址之间的距离? (Java服务器端)

时间:2011-01-24 05:41:24

标签: google-maps geolocation distance street-address

我正在开发一个“社交”地理感知应用程序,百万美元的问题是我如何列出一组“我的位置”在“X英里内”的项目,因为有数百万个应用程序在做我惊讶地发现,只有Google Maps API有免费的网络服务,更糟糕的是,只有在谷歌地图中使用它才支持。那么我必须开发自己的距离计算器吗?是否有任何免费/付费服务,我将至少将地址转换为XY坐标?

我确信有一个行业标准解决方案(免费或商业),但我还没找到它

4 个答案:

答案 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)

  1. 你想要“As Crow Flies”(直线)距离,还是行驶距离/时间?

  2. Mapquest的API似乎更容易,因为您可以使用查询字符串。

  3. 另一种选择是geocoder.us(或.ca,如果加拿大人)