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