1

私のdjangoアプリケーションでは、クラスOSMGeoAdmin(django.contrib.gis.adminから)のおかげで、管理者にいるときにマップが表示されます。唯一の問題は、このマップがGPS座標(緯度、経度)を逆にすることです。

例 : ポイント(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 に答える