4

私は、明示的な緯度と経度django.contrib.gis.geos.Pointを持つポイントをより適切に作成して処理することを専門としています。

私の現在のコード:

from django.contrib.gis.geos import Point

class LLPoint(Point):
    def __init__(self, *args, **kwargs):
        lat = kwargs.get('latitude')
        lng = kwargs.get('longitude')

        if lat and lng:
            super(LLPoint, self).__init__(lng, lat)
        elif lat or lng:
            raise TypeError(u'You must both declare latitude and longitude, '
                'not just one of them.')
        else:
            super(LLPoint, self).__init__(*args, **kwargs)

    def __unicode__(self):
        c = self.coordinates()
        return u'LLPoint Lat: %.5f Lng: %.5f' % (c['latitude'], c['longitude']) 

    def coordinates(self):
        return {
            'latitude': self.coords[1], 
            'longitude': self.coords[0]
        }

問題は:

>>> LLPoint(latitude=10.0, longitude=20.0)
<Point object at 0xdeadbeef>

Pointなぜオブジェクトを返すのですか? この方法では、サブクラスで宣言したものは何も使用できません。スタブ クラスで問題を再現しようとすると、うまくいきます。これはおそらく非常に愚かですが、私にはわかりません。

4

1 に答える 1

6

Point.__init__呼び出し

    super(Point, self).__init__(point, srid=srid)

呼び出すGEOSGeometry.__init__、呼び出す

    self._post_init(srid)

実行します

    self.__class__ = GEOS_CLASSES[self.geom_typeid]

のクラスをに変更selfPointます。悪。


あなたは試すことができます:

class LLPoint(Point):
    def __init__(self, *args, **kwargs):
        ...
        super(LLPoint, self).__init__(lng, lat)   # this changes self.__class__ to Point
        ...
        self.__class__ = LLPoint
于 2012-12-03T03:40:30.293 に答える