From bdb5ea0dd89b3f610a49f76f9ee1ca661ecf4c61 Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Fri, 26 Jan 2007 05:10:51 +0000 Subject: [PATCH] svn: r7986 --- .../src/Filters/Rules/Place/_HasNoLatOrLon.py | 53 ++++++ .../Rules/Place/_InLatLonNeighborhood.py | 161 ++++++++++++++++++ 2 files changed, 214 insertions(+) create mode 100644 gramps2/src/Filters/Rules/Place/_HasNoLatOrLon.py create mode 100644 gramps2/src/Filters/Rules/Place/_InLatLonNeighborhood.py diff --git a/gramps2/src/Filters/Rules/Place/_HasNoLatOrLon.py b/gramps2/src/Filters/Rules/Place/_HasNoLatOrLon.py new file mode 100644 index 000000000..501a0e8a0 --- /dev/null +++ b/gramps2/src/Filters/Rules/Place/_HasNoLatOrLon.py @@ -0,0 +1,53 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2002-2006 Donald N. Allingham +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + + +#------------------------------------------------------------------------- +# +# Standard Python modules +# +#------------------------------------------------------------------------- +from gettext import gettext as _ + +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- +from Filters.Rules._Rule import Rule + +#------------------------------------------------------------------------- +# +# HasNoLatOrLon +# +#------------------------------------------------------------------------- +class HasNoLatOrLon(Rule): + """Rule that checks if Latitude or Longitude are not given""" + + + labels = [] + name = _('Places with no latitude or longitude given') + description = _("Matches places with latitude or longitude empty") + category = _('Position filters') + + def apply(self,db,place): + if place.get_latitude().strip and place.get_longitude().strip() : + return False + return True diff --git a/gramps2/src/Filters/Rules/Place/_InLatLonNeighborhood.py b/gramps2/src/Filters/Rules/Place/_InLatLonNeighborhood.py new file mode 100644 index 000000000..c1a597cf9 --- /dev/null +++ b/gramps2/src/Filters/Rules/Place/_InLatLonNeighborhood.py @@ -0,0 +1,161 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2002-2006 Donald N. Allingham +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + + +#------------------------------------------------------------------------- +# +# Standard Python modules +# +#------------------------------------------------------------------------- +from gettext import gettext as _ + +#------------------------------------------------------------------------- +# +# GRAMPS modules +# +#------------------------------------------------------------------------- +from Filters.Rules._Rule import Rule +import PlaceUtils + +#------------------------------------------------------------------------- +# +# InLatLonNeighborhood +# +#------------------------------------------------------------------------- +class InLatLonNeighborhood(Rule): + """Rule that checks if a place is in the neighborhood of a given + Latitude or Longitude or""" + + + labels = [_('Latitude:'), _('Longitude:'), + _('Rectangle height:'), _('Rectangle width:')] + name = _('Places in neighborhood of given position') + description = _("Matches places with latitude or longitude positioned in " + "a rectangle of given height and width (in degrees), and " + "with middlepoint the given latitude and longitude." + ) + category = _('Position filters') + + def prepare(self,db): + if self.list[0] : + try: + self.halfheight = float(self.list[2])/2. + except ValueError : + self.halfheight = None + if self.halfheight != None and self.halfheight<= 0. : + self.halfheight = None + else : + self.halfheight = -1 + #give dummy value + self.list[0] = '0.0' + + if self.list[1] : + try: + self.halfwidth = float(self.list[3])/2. + except ValueError : + self.halfwidth = None + if self.halfwidth!=None and self.halfwidth<= 0. : + self.halfwidth = None + else : + self.halfwidth = -1 + #give dummy value + self.list[1] = '0.0' + + #we allow a band instead of a triangle + self.lat, self.lon = PlaceUtils.conv_lat_lon(self.list[0],self.list[1],"D.D8") + if self.lat != None and self.lon != None : + self.lat = float(self.lat) + self.lon = float(self.lon) + else : + self.lat = None; self.lon = None + + #we define the two squares we must look in + # can be 0, so check on None + if self.lat!=None and self.halfheight!=None and self.halfheight != -1 : + self.S = self.lat + self.halfheight + if self.S > 90. : self.S = 90. + self.N = self.lat - self.halfheight + if self.N < -90. : self.N = -90. + self.doublesquares = False + if self.lon!=None and self.halfwidth!=None and self.halfwidth != -1 : + if self.halfwidth >= 180. : + #the entire longitude is allowed, reset values + self.lon = 0. + self.E = 180. + self.W = -180. + else : + self.E = self.lon +self.halfwidth + self.W = self.lon -self.halfwidth + if self.E > 180. : + #we need to check in two squares: + self.doublesquares = True + self.E2 = self.E -360. + self.W2 = -180. + self.E = 180 + if self.W < -180. : + #we need to check in two squares: + self.doublesquares = True + self.W2 = self.W + 360. + self.E2 = 180. + self.W = -180 + + + def apply(self,db,place): + if self.halfheight == -1 and self.halfwidth ==-1 : + return False + + # when given, must be valid + if self.lat == None or self.lon == None : + return False + + # if height/width given, they must be valid + if self.halfheight == None or self.halfwidth == None : + return False + + #now we know at least one is given in the filter and is valid + + # the place we look at must have lat AND lon entered + if not ( place.get_latitude().strip and place.get_longitude().strip() ): + return False + + latpl, lonpl = PlaceUtils.conv_lat_lon(place.get_latitude(), + place.get_longitude(),"D.D8") + if latpl and lonpl : + latpl = float(latpl) + lonpl = float(lonpl) + if self.halfheight != -1 : + # check lat + if latpl < self.N or latpl > self.S : + return False + + if self.halfwidth != -1 : + #check lon: more difficult, we may cross the 180/-180 boundary + # and must keep counting + if self.doublesquares : + #two squares to look in : + if (lonpl self.E) and \ + (lonpl self.E2) : + return False + elif (lonpl self.E) : + return False + + return True + + return False