【问题标题】:GeoDjango, what SRID to use for PointField interfacing with Google Maps V3 API?GeoDjango,PointField 与 Google Maps V3 API 接口使用什么 SRID?
【发布时间】:2014-08-22 23:55:41
【问题描述】:

我有点困惑,我应该在 GeoDjango PointField 中将我的 SRID 值设置为什么,以便在通过 google maps api 将地址地理编码为通过 django-postgis 查询的坐标和距离的上下文中保持准确?

我在阅读网络和 stackover 流程​​中的线程时得到了不同的意见,我不确定该怎么做。如您所见,我的应用程序正在使用 geopy 和 google maps api 对地址进行地理编码。现在我的坐标字段没有设置默认为 4326 的 SRID,即(EPSG:4326)。现在显然这将地球视为一个球体,而不是一个平面。

根据以下问题的答案,例如谷歌地图使用 (EPSG 3857),其 SRID 显然为 900913。https://gis.stackexchange.com/questions/48949/epsg-3857-or-4326-for-googlemaps-openstreetmap-and-leaflet

这是否意味着我应该将我的 SRID 设置为 900913?我的所有餐厅模型的坐标都使用地理编码器以与下面相同的方法保存。我会这么认为。

现在这就是我被抛弃的地方,下面的教程http://invisibleroads.com/tutorials/geodjango-googlemaps-build.html 使用了一个点域,其 SRID 设置为 4326(默认),它们的标记点完美地显示在谷歌地图上。

目前我的查询相当准确,但仍然感觉有点不对劲。

感谢您的帮助,谢谢!

from geopy.geocoders import GoogleV3
from django.contrib.gis.geos import *
from django.contrib.gis.measure import D

geo = GoogleV3()

def home_page(request):
  distance = 3680
  address, coordinates = geo.geocode('Swanston Street, Melbourne Australia')
  ref_location = Point(coordinates)
  
  query = Restaurant.objects.filter(restaurant_location__distance_lte=(ref_location, D(m=distance))).distance(ref_location).order_by('distance')

  return render(request, 'swings/home.html', {'restaurants': query})

餐厅模型

class Restaurant(models.Model):
    name = models.CharField(max_length=25, blank=False)
    user = models.ForeignKey(User)
    address = models.CharField(max_length=50, blank=False)
    restaurant_location = models.PointField(null=False, blank=False)
    objects = models.GeoManager()

    def __str__(self):
        return self.name

【问题讨论】:

    标签: django google-maps google-maps-api-3 postgis geodjango


    【解决方案1】:

    您应该使用 4326(表示纬度和经度,使用 WGS84 基准面和球体来模拟地球的形状)向 Google 地图添加点。记录您在地球上的位置的设备(例如 GPS)会将数据保存在 4326 中,然后在 Google 地图内部将其投影到 3857(以米为单位)。如果您查看example for loading GeoJSON,您会看到这些点位于 4326 中。

    900913(这只是计算器写作中的 GOOGLE)引起了很多混乱,原因是最初 EPSG 对他们认为不准确的投影非常嗤之以鼻,主要是因为它假设世界是一个领域。无论如何,由于谷歌在全球的知名度和数学上的易处理性,它变得流行起来。随后,EPSG 给它一个新的官方名称 3857(从技术上讲,还有另一个,3587,只是为了引起更多的混乱)。所以,虽然人们还在谈论 900913,但官方应该使用 3587。3587 以米为单位进行投影,用于生成在 Google 地图中显示的图块,但不应该用于向其添加点源,您肯定要使用 4326 .

    如果你想了解更多关于这个的历史,这里有一篇好文章:http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/

    【讨论】:

    • 这很有帮助。历史课实际上帮助澄清了事情。谢谢!
    • 这是否也意味着我应该将 4326 用于从搜索 API 返回的点?
    • @bigblind,抱歉,哪个搜索 API?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2012-10-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多