如何在Java服务器端查找两个地址之间的距离?

6
我正在开发一个“社交”地理位置感知应用程序,关键问题是如何列出一组与“我的位置”相距“X英里”的项目,由于有数百万个应用程序可以做到这一点,我惊讶地发现只有 Google Maps API 提供免费的网络服务,更糟糕的是,只有在 Google 地图内使用时才支持。所以,我是否需要开发自己的距离计算器?是否有任何免费/付费服务,至少可以将地址转换为 XY 坐标?
我相信有行业标准解决方案(无论是免费还是商业),但我还没有找到。
4个回答

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

我会将这些 SQL 函数从服务器中用 C# 进行调用:

代码示例:

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;
}

这段文本是关于IT技术的,需要翻译成中文。它讲述了如何在最大距离范围内查找与自己接近的人。

这是免费版本。我认为SQL Server 2008可以通过地理包来实现此功能。


4
实际上,谷歌确实有可以在服务器端使用的Web服务来实现这一点。
首先,您需要使用Geocoding API将地址转换为纬度/经度坐标对。然后,您可以根据自己的需要使用它们(例如,与您自己的数据库进行比较,如果您正在存储这些内容)
如果您要查找的附近物品是谷歌可能已知的实际地点,则可以尝试使用谷歌的新Places API,它可以在一定半径内提供结果。
您应该注意,从纬度/经度坐标到距离的转换确实需要一些数学计算,但我认为最好在本地(在运行您的应用程序的服务器上)完成,而不是被分配给某个外部服务器,因为这只是数学问题。 通过谷歌搜索可以找到这个

4
如果你很幸运并且正在使用mysql或postgresql这两种支持空间查询的数据库,那么你可以对它们执行空间查询。对于mysql,有空间扩展,对于postgresql,有postgis
如果你决定手动操作,请参考此问题以获取帮助。另外,我不明白谷歌地点API如何帮助你,因为你正在寻找半径内的你的数据,而不是谷歌地点。 祝好!

3
  1. 您需要“直线距离”还是“驾车距离/时间”?

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

另一个选择是geocoder.us(如果在加拿大则为.ca)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接