Geo Location API并在半径范围内查找用户

时间:2011-08-08 02:48:49

标签: java geolocation

我有一个Java应用程序,我想找出访问者的位置。 API会给我一个访问者的邮政编码,然后根据该邮政编码,我会找到一个查询并让我的应用程序中的用户在25/50英里范围内。 或者,访问者可以输入他们感兴趣的邮政编码,应用程序应该返回半径为x英里的用户。 对于在系统中注册的用户,我们只有他们的邮政编码。 我查看了一些选项,但没有找到确切的解决方案。我不想下载邮政编码数据库并维护它们。 我不认为Google API支持这种东西。

2 个答案:

答案 0 :(得分:2)

我不知道它有多精确,但你看过IPinfoDB了吗?他们将返回XML和JSON结果,但您需要注册API密钥。它虽然没有为半径提供任何东西,但对于附近的邮政编码,您可以使用以下内容:http://www.geonames.org/export/web-services.html#findNearbyPostalCodes

答案 1 :(得分:2)

我找不到任何提供API的服务。经过大量研究后,我发现您必须将邮政编码及其纬度和经度位置下载到表格中。然后 计算要搜索的半径内的坐标。 这个网站对我帮助很大。 http://www.dougv.com/2009/03/27/getting-all-zip-codes-in-a-given-radius-from-a-known-point-zip-code-via-php-and-mysql/

如果您真的不想使用php

,那么这是java中的计算

//您可以通过查询邮政编码来获取数据库         Double latitude = Double.parseDouble(zipCode.getLatitude());         Double longitude = Double.parseDouble(zipCode.getLongitude());

    Double latN =Math.asin(
            Math.sin(Math.toRadians(latitude)) * Math.cos(distance/radius) + 
            Math.cos(Math.toRadians(latitude)) * Math.sin(distance/radius) * Math.cos(Math.toRadians(0)));


    Double latS =Math.asin(
            Math.sin(Math.toRadians(latitude)) * Math.cos(distance/radius) + 
            Math.cos(Math.toRadians(latitude)) * Math.sin(distance/radius) * Math.cos(Math.toRadians(180)));


    Double longE = Math.toRadians(longitude) + 
                    Math.atan2(
                            Math.sin(Math.toRadians(90)) * Math.sin(distance/radius)* Math.cos(Math.toRadians(latitude)) 
            , Math.cos(Math.toRadians(distance/radius)) - Math.sin(Math.toRadians(latitude))* Math.sin(Math.toRadians(latN)) );

    Double longW = Math.toRadians(longitude) + 
    Math.atan2(
                    Math.sin(Math.toRadians(270)) * Math.sin(distance/radius)* Math.cos(Math.toRadians(latitude)) 
                , Math.cos(Math.toRadians(distance/radius)) - Math.sin(Math.toRadians(latitude))* Math.sin(Math.toRadians(latN)) );

    System.out.println("Latutude N "+Math.toDegrees(latN) +" Latitide S "+Math.toDegrees(latS) +">>> Longitude E "+Math.toDegrees(longE) +" Longitude W "+Math.toDegrees(longW));