将IP地址转换为地理位置?

31

有没有人知道可以调用的开放式RESTful API,以将用户的IP地理编码为纬度和经度?

理想情况下,它应该类似于:http://google.com/geocode_api/?IP=1.2.3.4,并返回纬度和经度。


可能是重复的问题:如何从IP地址确定邮政编码和城市? - John Saunders
4
@John Saunder,实际上我并不在意用户所在的邮政编码或城市。我只是想知道他们的经度和纬度,这样我就可以将我的地图居中显示在他们的家庭位置上。 - Tim
为什么您认为答案不同?引用的API没有返回纬度和经度吗? - John Saunders
IPLocate.io 提供免费 API:https://www.iplocate.io/api/lookup/8.8.8.8 - 免责声明:我运营此服务。 - ttarik
Ipregistry: https://api.ipregistry.co/8.8.8.8?key=tryout - Laurent
5个回答

23

另一个提供准确城市信息的免费 REST API 是 http://freegeoip.net。请求非常简单,您可以使用类似以下的代码:

http://freegeoip.net/{format}/{ip_or_hostname}

要对IP地址进行地理编码,格式可以是csv, xmljson。他们的网站上有所有详细信息。

[更新:] FreeGeoIP.net过去并非一直作为公共服务连续可用。但该软件始终开源,并可在Github上找到。如果您需要高度可靠的服务或您的使用情况超过每小时15,000个请求的当前配额,则使用Docker很容易使本地安装运行。


2
截至2014年12月30日,freegeoip.net服务似乎已经停止工作。然而,Andy回复中提到的ipinfodb.com服务仍然可用。 - hooknc
1
截至2016年2月20日,freegeoip.net服务似乎正常工作。 - cengel
我该如何向这个网站发送多个IP地址? - Eray Balkanli
我猜你需要发出多个请求。但要注意他们的配额限制:“默认情况下,每小时允许进行最多10,000个查询。一旦达到此限制,所有请求都将导致HTTP 403禁止,直到您的配额清除为止。” - Stefan Haberl
2
截至2016年3月23日,freegeoip.net无法工作。 - user123456
我发现在本地安装freegeoip非常容易,并且可以避免远程服务器问题。https://github.com/fiorix/freegeoip/releases - cengel

8

这里有两个简单的调用...

示例调用:

返回的XML示例(ipinfodb):

<Response> 
  <Ip>122.169.8.137</Ip> 
  <Status>OK</Status> 
  <CountryCode>IN</CountryCode> 
  <CountryName>India</CountryName> 
  <RegionCode>10</RegionCode> 
  <RegionName>Haryana</RegionName> 
  <City>Kaul</City> 
  <ZipPostalCode></ZipPostalCode> 
  <Latitude>29.85</Latitude> 
  <Longitude>76.6667</Longitude> 
  <Timezone>0</Timezone> 
  <Gmtoffset>0</Gmtoffset> 
  <Dstoffset>0</Dstoffset> 
</Response> 

截至2014年12月30日,freegeoip.net服务似乎已经停止工作。然而,ipinfodb.com服务仍然可用,但是他们的API URL似乎已经更改。 - hooknc
死链已失效。 - Rocco The Taco

7
您可以使用谷歌API: http://code.google.com/apis/ajax/documentation/#ClientLocation 编辑 示例:
<script type="text/javascript"
    src="http://www.google.com/jsapi?key=ABCDEFG"></script>
<script type="text/javascript">
google.load("maps", "2.x", {callback: initialize});

function initialize() {
  if (google.loader.ClientLocation) {
      var lat = google.loader.ClientLocation.latitude;
      var long = google.loader.ClientLocation.longitude;
      alert ("lat: " + lat + "\nlong: " + long);
   }
   else { alert ("not available"); }
 }


那么我如何仅加载ClientLocation而不加载其他模块呢? - Tim
我已经添加了示例代码。但是看起来你实际上必须加载一个模块才能填充ClientLocation。你可以加载搜索API,它相对较小,可能已经存在于用户的缓存中。 要加载搜索API,请将“maps”更改为“search”,将“2.x”更改为“1”。 - Josiah
非常感谢 @Josiah,非常感谢。 - vinothini
很遗憾,这个API已经不再受支持了(我刚测试过了,google.loader.ClientLocation不存在)。请参见此处的讨论 - Greg Sadetsky
1
刚刚发现了另一个可以定位IP地址的Google API!请查看此答案 - Greg Sadetsky
显示剩余2条评论

7

在我的网站中,我使用 http://ip-api.com/ 来通过 IP 地址获取位置信息。它们有良好的限制(每分钟最多150个请求)。Ipinfo.io 只免费提供不到1000个请求每天

这是样例输出:

(
    [as] => AS8075 Microsoft Corporation
    [city] => Redmond
    [country] => United States
    [countryCode] => US
    [isp] => Microsoft bingbot
    [lat] => 47.674
    [lon] => -122.1215
    [org] => Microsoft bingbot
    [query] => 157.55.39.67
    [region] => WA
    [regionName] => Washington
    [status] => success
    [timezone] => America/Los_Angeles
    [zip] => 98052
)

以下是您可以使用的PHP代码:

$ip = $_SERVER['REMOTE_ADDR'];
$result = json_decode(file_get_contents("http://ip-api.com/json/{$ip}"));
//print_r ($result);
echo "{$result->lat},{$result->lon}";//48.156,17.142

2
现在的限制是150,如果超过限制,他们会禁止你的IP地址(证明)。 我们的系统将自动禁止每分钟超过150个请求的IP地址。要解除IP封锁,请单击此处。 - Valentine Konov
谢谢@ValentineKonov,我已经更新了答案。 - Jasom Dotnet
只是确认一下:与上面列出的一些相反,这个仍然在运行中。提供相当全面的信息源。 - Adam Bubela

2

这些都不会使用IP地址返回经纬度位置。 - George Filippakos
@geo171:我认为你需要以下其中一个网站来获取纬度/经度:服务:http://api.hostip.info/get_html.php?ip=12.215.42.19&position=true网站: http://www.digitalpoint.com/tools/geovis… http://www.geobytes.com/IpLocator.htm http://www.melissadata.com/lookups/iploc… http://www.ip2location.com/free.asp http://www.hostip.info/ http://www.networldmap.com/TryIt.htm http://www.private.org.il/IP2geo.html http://www.internetfrog.com/ http://webtools.live2support.com/misc_lo… http://www.seomoz.org/ip2loc/ip2loc.php http://www.webyield.net/domainquery.html - Tarek El-Mallah

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