svn: r7986
This commit is contained in:
parent
4812f0c8cc
commit
07473000d5
53
src/Filters/Rules/Place/_HasNoLatOrLon.py
Normal file
53
src/Filters/Rules/Place/_HasNoLatOrLon.py
Normal file
@ -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
|
161
src/Filters/Rules/Place/_InLatLonNeighborhood.py
Normal file
161
src/Filters/Rules/Place/_InLatLonNeighborhood.py
Normal file
@ -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.W or lonpl > self.E) and \
|
||||
(lonpl <self.W2 or lonpl > self.E2) :
|
||||
return False
|
||||
elif (lonpl <self.W or lonpl > self.E) :
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
return False
|
Loading…
Reference in New Issue
Block a user