试图通过IP获取用户位置

时间:2010-11-03 19:47:19

标签: django geolocation maps

我正在尝试通过他/她的IP地址找到用户,然后在谷歌地图中显示它们。什么是达到这个目的的最佳方法。或者有没有其他方法可以让用户拉/长并在谷歌地图而不是IP地址中显示em。

3 个答案:

答案 0 :(得分:8)

你的问题其实是2个问题。第一部分是从ip地址获取lat,lng。 AFAIK,google maps api不提供基于IP的地理定位。因此,要在Google地图上显示IP地址,您必须先获取地理位置(作为地址,或作为lat,lng)。网上有各种付费和非付费API,允许你这样做,而django本身也带有一个实用工具。 文档是here。您的用例将实现为:

from django.contrib.gis.utils import GeoIP
g = GeoIP()
lat,lng = g.lat_lon(user_ip)

address = g.city(user_ip)

注意:此实用程序或许多基于IP的免费地理定位API之一可能不是非常准确。

至于第二部分,要在Google地图上显示此位置,您可以查看此应用程序:

http://code.google.com/p/django-googlemap/

答案 1 :(得分:0)

您可以使用以下内容,但我不确定这是否适用于所有浏览器。

if (navigator) {
     if (navigator.geolocation) {
         navigator.geolocation.getCurrentPosition(function (position) {
             do_something(position.coords.latitude, position.coords.longitude);
         });
     }
 }

答案 2 :(得分:0)

找到用户取决于您要定位的设备以及您希望在地图上显示其位置的粒度/准确度。

IP地址更适合笔记本电脑和其他非GPS设备。其次,正如您所知,IP地址只会指向用户的网关。在我的情况下,网关距离我居住的地方大约8英里,因此您可以想象精确度仅适用于某类应用程序,如omniture或mixpanel等分析工具。

另一方面,如果您正在为移动设备开发应用,则可以在here提出的问题中开始阅读相关内容。使用gps / agps可以在几米内提供精确度。这更适合像gowalla或foursquare这样的LBS应用程序。 HTML5使您可以轻松实现后者,尤其是在您定位iOS和Android设备时。

下面给出了python中的一些袖口代码。可以找到gmaps api v3的详细信息here

Python中用于记录位置和生成标记的服务器实现

class RecordLocation(webapp.RequestHandler):
  def post(self):
    session=SessionManager(self)
        if session.is_set():  marker=Markers(lat=self.request.get('lat'),lon=self.request.get('lon'),user_id=self.request.get('user'))
        marker.put()
        self.response.out.write('<html><body>')
        self.response.out.write(" Location Updated<br/>")
        self.response.out.write('</body></html>')

    class GenerateMarkers(webapp.RequestHandler):
        def get(self):
            session=SessionManager(self)
            if session.is_set():
                markers=db.GqlQuery("SELECT * FROM Markers")
                doc='<?xml version="1.0"?>'
                doc+='<markers>'
                for marker in markers:
                    doc+='<marker '
                    doc+='lat="'+marker.lat+'" '
                    doc+='lon="'+marker.lon+'" '
                    doc+='type="restaurant" '
                    doc+='/>'
                    doc+='</markers>'
                self.response.out.write(doc)