【发布时间】: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 中打印。