2

我已经在这个项目上工作了一段时间。我发现有许多免费数据库可以将 IP 编号(IP 地址的某种操作)映射到长纬度坐标。但是,这些数据库的准确性真的很差。

我试图在一些数据库之间合并,并合并到最常见的答案或答案中的“平均值”。

这确实提高了我的准确性,但没有我预期的那么多。

我还有一个想法——使用 Traceroute 命令找出到这个目标的路径,并根据途中的跳数来确定我的目标在哪里。

我正在寻找新的想法或某种有助于确定位置的协议。我一直在考虑公共 cookie,但这可能太具有侵略性了。此外,一位朋友告诉我,SNMP 协议可能对我有帮助,但实现起来非常复杂。

我的目标是确定这台计算机在哪个城市。这是我瞄准的准确度。

谢谢和对不起我的英语!

4

2 回答 2

1

它不能可靠地工作。例如,采取以下场景:

  • 我的公司有一个 VPN。

    有了这个,我可以从我的公司获得一个 IP 地址,而无需亲自到场。

    我在哪里?在我公司的地方?或者在世界的另一端,我在哪里度过假期?

  • 我与我的提供商有拨号连接。

    我在哪里?在拨入节点所在的位置,还是我真正所在的位置?

这两个例子表明,IP 地址本身不保存(也不能保存)任何地理信息。它可以通过经验与此类相关 - 用户将他们的(动态?)IP地址输入数据库,与他们当前的IP地址相关,但仅此而已。可以说,系统固有的不能精确。

如果您寻找通过 ADSL 和动态 IP 地址上网的“普通用户”,您不知道提供商从同一个池中获取地址的区域有多大。在我终止连接后,下一个获取此 IP 地址的用户可能距离我 50 公里、500 公里甚至 2000 公里(取决于您居住的国家/地区)。

即使是分配给企业客户的固定 IP 也可能会改变其位置:企业移动,或者它不复存在并且 IP 地址被分配给完全不同的客户。

随着 IPv6 越来越流行,所有这些东西将在接下来的几个月/几年内再次发生变化。

于 2011-11-03T16:35:32.857 回答
1

您可以使用 HTML5 的新地理位置。示例:http ://html5demos.com/geo

(取自上面的链接)

代码:

<script>
function success(position) {
  var s = document.querySelector('#status');

  if (s.className == 'success') {
    // not sure why we're hitting this twice in FF, I think it's to do with a cached result coming back    
    return;
  }

  s.innerHTML = "found you!";
  s.className = 'success';

  var mapcanvas = document.createElement('div');
  mapcanvas.id = 'mapcanvas';
  mapcanvas.style.height = '400px';
  mapcanvas.style.width = '560px';

  document.querySelector('article').appendChild(mapcanvas);

  var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
  var myOptions = {
    zoom: 15,
    center: latlng,
    mapTypeControl: false,
    navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  var map = new google.maps.Map(document.getElementById("mapcanvas"), myOptions);

  var marker = new google.maps.Marker({
      position: latlng, 
      map: map, 
      title:"You are here!"
  });
}

function error(msg) {
  var s = document.querySelector('#status');
  s.innerHTML = typeof msg == 'string' ? msg : "failed";
  s.className = 'fail';

  // console.log(arguments);
}

if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition(success, error);
} else {
  error('not supported');
}

</script>

至于数据库,我一直在走这条路,没有完美的解决方案,所有数据库只能给你大约 50 英里的准确度。

有了这个,您可以使用 Ajax 将位置数据推送到您的服务器。

于 2011-11-03T16:15:45.510 回答