我想知道如何使用JavaScript通过纬度和经度获取国家名称。我可以使用Google Maps的JavaScript API。我还能获取城市和邮编吗?
编辑:我的目标是自动填充地址字段,而不是在地图上显示它。
我想知道如何使用JavaScript通过纬度和经度获取国家名称。我可以使用Google Maps的JavaScript API。我还能获取城市和邮编吗?
编辑:我的目标是自动填充地址字段,而不是在地图上显示它。
不确定是否适用于谷歌地图,但有一个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?
- 参数:
lat
、lng
、type
、lang
、radius
(最近海岸线国家的缓冲区半径)- 结果:返回给定经纬度的ISO国家代码
使用参数
type = xml
,此服务将返回带有ISO国家代码和国家名称的XML文档。可选参数lang可用于指定国家名称所在的语言。JSON输出由type = JSON
生成。
请参阅文档
编辑:请注意, demo
只是演示用户,您应该在 http://www.geonames.org/login 创建用户帐户以使用该服务。
Google Geocoding API以JSON格式提供这些结果。它有一个免费的层次,但你需要支付无限制对API的请求。
请求的API链接将是这样的:
'https://maps.googleapis.com/maps/api/geocode/json?latlng=11.2742848,75.8013801&key=YOUR_API_KEY_HERE'
如果需要一个自包含的库(即没有服务器/网络连接,且速度快),并且只需要国家信息,则以下基于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点所在国家的国家代码。
<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>
如果您只需要基于坐标(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/
你可以通过以下方式实现: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 获取位置数据,包括城市。我使用 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]);
"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"
},