从纬度和经度获取国家

72

我想知道如何使用JavaScript通过纬度和经度获取国家名称。我可以使用Google Maps的JavaScript API。我还能获取城市和邮编吗?

编辑:我的目标是自动填充地址字段,而不是在地图上显示它。


http://code.google.com/apis/maps/documentation/geocoding/ - deceze
8个回答

81

不确定是否适用于谷歌地图,但有一个Web服务可以返回国家代码,并以经纬度作为参数。

以下是示例:
http://api.geonames.org/countryCodeJSON?lat=49.03&lng=10.2&username=demo

返回JSON数据: {"languages":"de","distance":"0","countryCode":"DE","countryName":"Germany"}

我还发现了一个简短的描述:

给定点的ISO国家代码。

  • Webservice类型:REST
  • Url:ws.geonames.org/countryCode?
  • 参数:latlngtypelangradius(最近海岸线国家的缓冲区半径)
  • 结果:返回给定经纬度的ISO国家代码

使用参数type = xml,此服务将返回带有ISO国家代码和国家名称的XML文档。可选参数lang可用于指定国家名称所在的语言。JSON输出由type = JSON生成。

请参阅文档

编辑:请注意, demo 只是演示用户,您应该在 http://www.geonames.org/login 创建用户帐户以使用该服务。


也许在你检查的时候服务器比较慢。我昨天和刚才都检查过:两次都立即响应。 - Christian
1
每2000个请求限制一次。 - Dan Ciborowski - MSFT
你应该使用高级API(api.geonames.org)以获得更快的响应速度... WS*非常慢.. - themihai
如果其他人(例如我)在将结果与某些常量进行比较时遇到问题,请注意 ISO 代码后面有一个换行符。 - zbr
我不知道为什么没有收到注册邮件。 - larsaars
显示剩余3条评论

20

Google Geocoding API以JSON格式提供这些结果。它有一个免费的层次,但你需要支付无限制对API的请求。

请求的API链接将是这样的:

'https://maps.googleapis.com/maps/api/geocode/json?latlng=11.2742848,75.8013801&key=YOUR_API_KEY_HERE'

什么是无限访问? - jofftiquez
1
Google Maps 地理编码 API 在免费使用方面有一些限制,例如每天最多免费请求次数为 2,500 次,每秒最多免费请求次数为 10 次。如需更多详细信息,请访问 https://developers.google.com/maps/documentation/geocoding/usage-limits。 - Nishad Up
1
除非坐标附近有感兴趣的点,否则无法工作。如果没有,则不返回任何内容。 - tar
它不再工作了。请参见:{ "error_message" : "您必须使用API密钥对每个请求进行身份验证,以访问Google Maps平台API。有关更多信息,请参阅http://g.co/dev/maps-no-account", "results" : [], "status" : "REQUEST_DENIED" } - Yunhe
我已更新至2019年11月的响应。您必须将API密钥添加到URL中才能命中API端点。 - Dr. Younes Henni

12

如果需要一个自包含的库(即没有服务器/网络连接,且速度快),并且只需要国家信息,则以下基于openstreetmap数据的库可能会有用 - https://github.com/hlaw/codegrid-js

<script type="text/javascript" src="[path]/codegrid.js"></script>
grid = codegrid.CodeGrid(); // initialize

grid.getCode (lat, lng, function (err, code) { ... });

回调函数使用code参数,该参数为latlng点所在国家的国家代码。


当JavaScript无法本地读取JSON文件时,如何在没有服务器的情况下使其正常工作? - CodeCabin
希望我能让它工作,但这意味着你需要包含所有的瓦片和worldjson。 - sim1
哈利路亚!有一个解决方案,不需要一些不稳定的“免费”地理位置服务器。 - Rick Davies
@headduck 我在做这个的时候遇到了CORS错误,有什么方法可以解决吗? - Paul McBurney

8
<form id="form1" runat="server">
<div>
    <script type="text/javascript" src="http://j.maxmind.com/app/geoip.js" ></script>
    <br />Country Code:
    <script type="text/javascript">document.write(geoip_country_code());</script>
    <br />Country Name:
    <script type="text/javascript">document.write(geoip_country_name());</script>
    <br />City:
    <script type="text/javascript">document.write(geoip_city());</script>
    <br />Region:
    <script type="text/javascript">document.write(geoip_region());</script>
    <br />Region Name:
    <script type="text/javascript">document.write(geoip_region_name());</script>
    <br />Latitude:
    <script type="text/javascript">document.write(geoip_latitude());</script>
    <br />Longitude:
    <script type="text/javascript">document.write(geoip_longitude());</script>
    <br />Postal Code:
    <script type="text/javascript">document.write(geoip_postal_code());</script>

</div>
</form>

2
似乎无法正常工作,因为http://j.maxmind.com/app/geoip.js脚本不再加载。 - xarlymg89

5

是的,您可以使用谷歌地图找到给定纬度和经度所在的国家。使用反向地理编码服务

您可以从服务器返回的响应中获取国家、城市、邮政编码和完整地址。有关详细信息,请查看链接中的示例;)


3

如果您只需要基于坐标(lat,lng)的国家信息,则可以使用coordinate_to_country npm包。这样,您就不需要进行任何API调用。它基于OSM国家边界。

编辑:

值得注意的是,coordinate_to_country npm包相当重,会在客户端引起效率问题。这是由于@osm_borders/maritime_10m依赖包中的约50Mb地理JSON文件导致的。

因此,如果您不需要在坐标查找中包含所有国家,则最好使用geojson-geometries-lookup npm包和您所需国家的自定义地理JSON文件。

另一个选择是使用低分辨率的国家形状文件来减小文件大小 - 这可能会影响准确性。

这里有一个网站可以下载自定义的geojson国家形状:https://osm-boundaries.com/


否则,如果您需要更多的位置信息(城市、地址、社区等),您可以探索各种地理编码API,例如:

0

你可以通过以下方式实现:https://www.weatherapi.com/ 它是免费的。

我的演示使用React逐步实现,但你可以选择任何你想要的方式,关键是使用这个天气API,它接受经度和纬度作为字符串来生成城市和天气信息-> https://api.weatherapi.com/v1/forecast.json?key=YOUR-KEY&q=LATITUDE,LONGITUDE&days=1&aqi=no&alerts=n

注意:你需要注册并生成自己的API密钥

你需要4个状态来完成此操作:

const [userAllowedLocation, setUserAllowedLocation] = useState(true);
const [latitude, setLatitude] = useState("");
const [longitude, setLongitude] = useState("");
const [city, setCity] = useState("");

获取纬度和经度 + 弹出窗口

首先:从用户请求“位置”访问权限(这将弹出一个窗口),使用此代码并将状态设置为纬度和经度。

useEffect(() => {
    function getPosition() {
        const successCallback = (position) => {
            console.log(position);
            setLatitude(position.coords.latitude);
            setLongitude(position.coords.longitude);
            setUserAllowedLocation(true);
        };

        const errorCallback = (error) => {
            setUserAllowedLocation(false);
            console.log(error);
        };

        navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
    }

    getPosition();
}, []);

根据经纬度获取城市/国家:

第二步使用https://www.weatherapi.com/ API,基于经纬度获取城市和其他信息

API看起来像这样:https://api.weatherapi.com/v1/forecast.json?key=3e5e13fac8354c818de152831211305&q=53.3498053,-6.2603097&days=1&aqi=no&alerts=n

API 及其解释:https://api.weatherapi.com/v1/forecast.json?key=3e5e13fac8354c818de152831211305&q=LATITUDE,LONGITUDE&days=1&aqi=no&alerts=n

现在使用经纬度调用此 API 获取位置数据,包括城市。我使用 useEffect 作为触发器,所以一旦获得 Latitude 信息,就使用 axios 调用 api 并将城市状态设置为 api 对象中出现的任何内容。

useEffect(() => {
    if (latitude === "" || longitude === "") { // this is to stop fetching data on component mount, cause we have no Latitude and Longitude YET
        return;
    }

    async function getWeather() {
        let res = await axios.get(
            `https://api.weatherapi.com/v1/forecast.json?key=3e5e13fac8354c818de152831211305&q=${latitude},${longitude}&days=1&aqi=no&alerts=no`
        );
        console.log(res.data);
        console.log(res.data.location.name);
        setCity(res.data.location.name);
    }
    getWeather();
}, [latitude, longitude]);

这是我YouTube频道的视频,您可以在此观看演示:https://youtu.be/gxcG8V3Fpbk API的结果:
"location": {
"name": "Dublin",
"region": "Dublin",
"country": "Ireland",
"lat": 53.35,
"lon": -6.26,
"tz_id": "Europe/Dublin",
"localtime_epoch": 1673737376,
"localtime": "2023-01-14 23:02"
},

0

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