【问题标题】:Why does print show SRID 3847 in Geodjango?为什么打印在 Geodjango 中显示 SRID 3847?
【发布时间】:2021-09-07 08:37:11
【问题描述】:

我正在使用 Geodjango 和 PostGIS 开发一个应用程序。在我网站的管理区域中,所有多边形都正确显示,(默认)SRID 为 4326,例如

SRID=4326;POLYGON ((0.6564331054687499 52.13854550670472, 0.6289672851562499 52.08456959594681, 0.7553100585937497 52.08456959594681, 0.6564331054687499 52.13854550670472))

为什么,当我 print 到 Web 服务器/控制台时,SRID 会显示在 3857 中?上面的管理区域多边形打印为:

SRID=3857;POLYGON ((73073.79904062848 6825215.129639958, 70016.31790922143 6815431.190019455, 84080.73111369385 6815431.190019455, 73073.79904062848 6825215.129639958))

此外,如果我将形状渲染到我的模板中,例如{{geometry.polygon}}{{geometry.buffer}} 都使用正确的 SRID 4326 呈现。

因此,在views.py(或其他地方)中执行print 时,多边形打印在3857 中。

请注意,我使用OSMWidget 来获取用户输入的多边形。但是,我明确定义了地图的 SRID:

class jobForm(forms.ModelForm):
    location = PolygonField(
        widget=OSMWidget(
            attrs={'map_width': 800,
                   'map_height': 500,
                   'map_srid': 4326,
                   'template_name': 'gis/openlayers-osm.html',
                   'default_zoom':8,
                   'default_lat': 52,
                   'default_lon': 0.5}))

于 21 年 9 月 16 日编辑 经过进一步的实验,我认为问题出现在表单提交和将数据提交到模型之间的空间中。

OSMWidget 有一个名为 map_srid 的参数,从表面上看,它允许您指定表单中返回的坐标的 SRID。因此,设置map_srid=4326 应该返回该格式的坐标。然而,事实并非如此。如果您打印:

form.cleaned_data['my_geometry_field']

无论您如何设置map_srid,它将在 3857 中打印。

一旦您将表单的数据提交给模型,它就会转换为您在字段中设置的任何 SRID(默认为 4326)。如果你这样做(伪代码)mymodel.objects.get() 然后print(my_model_field) 你会看到你的坐标显示在你所期望的 4326 中。

因此我怀疑OSMWidget 存在错误。那或者我完全误解了这个表单小部件的工作原理。

【问题讨论】:

  • SRID 3857 以米为单位,而 4326 为坐标表示
  • 我知道两者之间的技术差异。我不明白为什么管理区域在 4326 中显示多边形,而 print 在 3857 中显示相同的多边形。
  • @Simon 您是否将输入保存在模型中?如果是,你能分享你对它的定义吗?
  • 嗨@JohnMoutafis 不太清楚你的意思。我正在从表单中获取数据,并在form_valid() 中进行一些操作。在form_valid 内,如果我在数据上调用save() 并检查管理区域,表单数据将保存在4326 中。但是,如果我打印表单的任何字段(例如print(form.cleaned_data['my_geometry_field']),它会在3857 中打印。
  • 我认为问题出在提交表单和将数据提交到我的模型之间的混乱中。虽然我已将 OSMWidget 中的 map_srid 指定为 4326,但似乎这被忽略了,因为 print(form.cleaned_data['my_geometry_field'] 打印 3857 中的坐标。但是,一旦保存到数据库,如果我这样做 mymodel.objects.get() 并打印几何字段那个调用,一切都如你所料在 4326 中打印。

标签: django gis geodjango


【解决方案1】:

好的,在这里回答我自己的问题。这让我咬牙切齿,我不确定我是不是太密集了,还是有什么虫子。对于那些需要它的人,可以找到地理空间字段的官方 Django 文档here

我的理解是 Django 中的“地理空间的东西”(在此处广泛使用该术语)默认为 WGS84(SRID 4326)。我的意思是,只要您不特意覆盖参数/属性,它将默认为 4326。无论出于何种原因,这似乎不适用于 GeoDjango 表单字段。

而在我的问题中,我将我的地理空间字段指定为:

class jobForm(forms.ModelForm):
    location = PolygonField(
        widget=OSMWidget(
            attrs={'map_width': 800,
                   'map_height': 500,
                   'map_srid': 4326,
                   'template_name': 'gis/openlayers-osm.html',
                   'default_zoom':8,
                   'default_lat': 52,
                   'default_lon': 0.5}))

我应该做的是明确设置 SRID 参数。因此它应该是:

class jobForm(forms.ModelForm):
    location = PolygonField(
        srid=4326,
        widget=OSMWidget(
            attrs={'map_width': 800,
                   'map_height': 500,
                   'map_srid': 4326,
                   'template_name': 'gis/openlayers-osm.html',
                   'default_zoom':8,
                   'default_lat': 52,
                   'default_lon': 0.5}))

我在 Django 文档中看不到任何关于为什么,如果您没有在表单的几何字段中指定 SRID,它会在 3857 中开始吐出坐标。但它确实是出于……原因。如果这种情况有正当的理由——也许我在文档中遗漏了一些东西——那么我真的很想知道发生了什么。

【讨论】:

    猜你喜欢
    • 2015-08-29
    • 2022-07-09
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多