1

在我的 django 应用程序中,由于 OSMGeoAdmin 类(来自 django.contrib.gis.admin),我在管理员中显示了一张地图,唯一的问题是这张地图有点反转 GPS 坐标(纬度,经度)。

示例:Point(48, 2) 应指向奥尔良(法国)附近,而不是地图指向索马里附近的 (2, 48)。

服务器没有问题,但是当我想检查这些坐标时。

有人可以帮我解决这个问题吗?

4

2 回答 2

1

如果你在你的数据库中的坐标是错误的,你应该解决这个问题。在./manage.py shell

from app.models import Point

for obj in Point.objects.all():
    obj.lat, obj.lng = obj.lng, obj.lat
    obj.save()

现在你只需要解决你的“逆向”问题。坐标首先以错误的方式存储的原因。

编辑

如果您只想以相反的方式返回坐标,则可以在模型上定义自定义方法以向对象添加自定义“行级”功能。请参阅:模型方法

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 带有一些小部件。阅读他们的代码是一个很好的起点,它将了解小部件在哪里以“错误”的方式应用点信息。祝你好运。

于 2013-09-02T09:57:58.807 回答
1

通过一个简单的调整解决了这个问题。重新定义渲染方法要简单得多,并不意味着修改数据库/模型。例如 :

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 方法以再次反转您的坐标。

于 2014-02-07T13:40:53.723 回答