在我的django应用程序中,当我在管理员中时,由于类OSMGeoAdmin(来自django.contrib.gis.admin),我有一个地图显示,唯一的问题是这个地图有点反转GPS坐标(lat,长)。
示例:Point(48,2)应指向Orléans(法国)附近,而不是地图指向索马里附近的(2,48)。
服务器没有问题,但是当我想检查那些坐标时。
有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
如果你的数据库中的坐标是错误的,你应该解决这个问题。在./manage.py shell
:
from app.models import Point
for obj in Point.objects.all():
obj.lat, obj.lng = obj.lng, obj.lat
obj.save()
现在你只需修复你的'反向'问题。首先将坐标以错误的方式存储的原因。
修改强>
如果您只想以相反的方式返回坐标,则可以在模型上定义自定义方法,以向对象添加自定义“行级”功能。请参阅:Model methods。
def _get_reversed_point(self):
"Returns the reversed point (lng, lat)."
return (self.point.lng, self.point.lat)
reversed_point = property(get_reversed_point)
现在您可以正常查询数据库,在处理反转点时使用obj.reversed_point
将返回反转的元组。
编辑2
reversed_point
不是表单的一部分,因此除非您自己添加,否则无法在更改视图中使用。这是由ModelAdmin.form完成的。在表单中,您可以(重新)定义字段并指定窗口小部件。通过覆盖切除的小部件来创建小部件。它是这样的:
from somewhere import SomeWidget
class MyWidget(SomeWidget):
def render(self, name, value, attrs=None):
output = []
template = '<p>Your html that will display a beautiful map. Point: %(lat)s %(lng)s</p>'
output.append(template % {'lat':self.instance.point.lat, 'lng':self.instance.point.lng, })
output.append(super(SomeWidget, self).render(name, value, attrs))
return mark_safe(u''.join(output))
class MyForm(forms.ModelForm):
point = forms.SomeField(widget=MyWidget)
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
if hasattr(self, 'instance'):
# This gives the widget access to all fields in MyModel object.
self.fields['point'].widget.instance = self.instance
class Meta:
model = MyModel
exclude = []
class MyAdmin(admin.ModelAdmin):
form = MyForm
GeoDjango附带some widgets。阅读他们的代码是一个很好的起点,并将了解小部件在哪里应用点信息“错误”的方式。祝你好运。
答案 1 :(得分:1)
通过简单的调整解决了这个问题。重新定义render方法要简单得多,并不意味着数据库/模型修改。例如:
def get_map_widget(self, db_field):
mapped = super(MissionAdmin, self).get_map_widget(db_field)
def render(inner_self, name, value, attrs=None):
if value and isinstance(value, Point):
value.x, value.y = value.y, value.x
return super(mapped, inner_self).render(name, value, attrs)
mapped.render = render
return mapped
这意味着在渲染地图时,就在生成HTML(渲染过程)之前,我只是在显示它们时反转点。当然,如果它不是一个只读的地图,那就有点危险了。在这种情况下,您必须修改save_model方法以再次反转您的坐标。