为什么Geodjango中print输出的多边形SRID为3857而非设置的4326
问题原因
你对OSMWidget的map_srid参数存在理解偏差:该参数仅用于指定前端OpenLayers地图渲染时使用的投影坐标系,而非指定表单提交后返回的几何数据SRID。OSM地图的前端渲染默认采用3857投影,因此无论map_srid如何设置,组件提交给form.cleaned_data的原始几何数据默认都是3857坐标系。
而模型字段、模板渲染输出为4326的原因是:GeoDjango的模型几何字段(如PolygonField)默认开启自动投影转换,只要你模型字段的srid参数为默认的4326,几何数据写入数据库时会自动从输入的3857转换为4326存储,因此从数据库查询、模板渲染调用的都是转换后的4326坐标。
解决方案
如果需要在cleaned_data阶段直接获取4326坐标系的几何数据,可采用以下任意一种方法:
- 给表单的
PolygonField显式指定srid参数,表单字段会自动完成坐标转换:
class jobForm(forms.ModelForm): location = PolygonField( srid=4326, # 新增该行指定表单字段的目标SRID 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}))
- 在表单的clean方法中手动执行坐标转换:
class jobForm(forms.ModelForm): # 原有字段定义保持不变 def clean_location(self): geom = self.cleaned_data['location'] if geom.srid != 4326: geom.transform(4326) return geom
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

