@@ -49,46 +49,40 @@ def as_mql(self, field, value, params=None):
4949 }
5050
5151
52- class DistanceGTE (Operator ):
53- name = "distance_gte "
52+ class DistanceLTE (Operator ):
53+ name = "distance_lte "
5454
55- def as_mql (self , field , value , params = None ):
56- distance = params [0 ].m if hasattr (params [0 ], "m" ) else params [0 ]
55+ def get_geo_within (self , value , params ):
56+ distance = params [0 ]
57+ # Get the distance in meters if it's a Distance object.
58+ distance = distance .m if hasattr (distance , "m" ) else distance
5759 return {
58- field : {
59- "$not" : {
60- "$geoWithin" : {
61- "$centerSphere" : [
62- value ["coordinates" ],
63- distance / 6378100 , # radius of earth in meters
64- ],
65- }
66- }
60+ "$geoWithin" : {
61+ "$centerSphere" : [
62+ value ["coordinates" ],
63+ distance / 6378100 , # radius of earth in meters
64+ ],
6765 }
6866 }
6967
68+ def as_mql (self , field , value , params = None ):
69+ return {field : self .get_geo_within (value , params )}
7070
71- class DistanceLTE (Operator ):
72- name = "distance_lte"
71+
72+ class DistanceGTE (DistanceLTE ):
73+ name = "distance_gte"
7374
7475 def as_mql (self , field , value , params = None ):
75- distance = params [0 ].m if hasattr (params [0 ], "m" ) else params [0 ]
76- return {
77- field : {
78- "$geoWithin" : {
79- "$centerSphere" : [
80- value ["coordinates" ],
81- distance / 6378100 , # radius of earth in meters
82- ],
83- }
84- }
85- }
76+ return {field : {"$not" : self .get_geo_within (value , params )}}
8677
8778
8879class DWithin (Operator ):
8980 name = "dwithin"
9081
9182 def as_mql (self , field , value , params = None ):
83+ # The parameter is always in degrees. GISOperations.get_distance()
84+ # prohibits using Distance objects since MongoDB doesn't support any
85+ # projected systems.
9286 param = radians (params [0 ])
9387 return {field : {"$geoWithin" : {"$centerSphere" : [value ["coordinates" ], param ]}}}
9488
0 commit comments