diff --git a/.gitignore b/.gitignore index ab71872..bb8955e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ *.pyc /GeoAlchemy.egg-info /doc/_build +/build/ +/dist/ diff --git a/geoalchemy/base.py b/geoalchemy/base.py index 04c1edb..471c8de 100644 --- a/geoalchemy/base.py +++ b/geoalchemy/base.py @@ -3,10 +3,17 @@ from sqlalchemy.sql.expression import ColumnClause, literal from sqlalchemy.types import UserDefinedType from sqlalchemy.ext.compiler import compiles +import six -from utils import from_wkt -from functions import functions, _get_function, BaseFunction - +if six.PY3: + from .utils import from_wkt + from .functions import functions, _get_function, BaseFunction + buffer = memoryview + ColumnComparator = ColumnProperty.Comparator +else: + from utils import from_wkt + from functions import functions, _get_function, BaseFunction + ColumnComparator = ColumnProperty.ColumnComparator # Base classes for geoalchemy class SpatialElement(object): @@ -56,7 +63,7 @@ class WKTSpatialElement(SpatialElement, expression.Function): """ def __init__(self, desc, srid=4326, geometry_type='GEOMETRY'): - assert isinstance(desc, basestring) + assert isinstance(desc, six.string_types) self.desc = desc self.srid = srid self.geometry_type = geometry_type @@ -85,7 +92,7 @@ class WKBSpatialElement(SpatialElement, expression.Function): """ def __init__(self, desc, srid=4326, geometry_type='GEOMETRY'): - assert isinstance(desc, (basestring, buffer)) + assert isinstance(desc, (six.binary_type, buffer)) # python3: buffer -> memoryview self.desc = desc self.srid = srid self.geometry_type = geometry_type @@ -96,11 +103,9 @@ def __init__(self, desc, srid=4326, geometry_type='GEOMETRY'): def __compile_wkbspatialelement(element, compiler, **kw): from geoalchemy.dialect import DialectManager database_dialect = DialectManager.get_spatial_dialect(compiler.dialect) - function = _get_function(element, compiler, (database_dialect.bind_wkb_value(element), element.srid), kw.get('within_columns_clause', False)) - return compiler.process(function) @@ -201,7 +206,7 @@ def _to_gis(value, srid_db): if isinstance(value.desc, (WKBSpatialElement, WKTSpatialElement)): return _check_srid(value.desc, srid_db) return _check_srid(value, srid_db) - elif isinstance(value, basestring): + elif isinstance(value, six.string_types): return _check_srid(WKTSpatialElement(value), srid_db) elif isinstance(value, expression.ClauseElement): return value @@ -239,7 +244,7 @@ def _make_proxy(self, selectable, name=None): def __compile_rawcolumn(rawcolumn, compiler, **kw): return compiler.visit_column(rawcolumn.column) -class SpatialComparator(ColumnProperty.ColumnComparator): +class SpatialComparator(ColumnComparator): """Intercepts standard Column operators on mapped class attributes and overrides their behavior. @@ -259,7 +264,7 @@ def RAW(self): return RawColumn(self.__clause_element__()) def __getattr__(self, name): - return getattr(functions, name)(self) + return getattr(functions, name)(self.prop.columns[0]) # override the __eq__() operator (allows to use '==' on geometries) def __eq__(self, other): diff --git a/geoalchemy/dialect.py b/geoalchemy/dialect.py index 0f00754..0b555b0 100644 --- a/geoalchemy/dialect.py +++ b/geoalchemy/dialect.py @@ -7,6 +7,7 @@ from geoalchemy.functions import functions from geoalchemy.base import WKTSpatialElement, WKBSpatialElement,\ DBSpatialElement +import six class SpatialDialect(object): """This class bundles all required classes and methods to support @@ -202,7 +203,7 @@ def get_spatial_dialect(dialect): """ possible_spatial_dialects = [spatial_dialect for (dialect_sqlalchemy, spatial_dialect) - in DialectManager.__dialects().iteritems() + in six.iteritems(DialectManager.__dialects()) if isinstance(dialect, dialect_sqlalchemy)] if possible_spatial_dialects: diff --git a/geoalchemy/functions.py b/geoalchemy/functions.py index 521fb2e..9b8920d 100644 --- a/geoalchemy/functions.py +++ b/geoalchemy/functions.py @@ -4,6 +4,7 @@ from sqlalchemy.types import NullType, TypeDecorator import types import re +import six WKT_REGEX = re.compile('.*\\(.*\\).*') @@ -14,7 +15,6 @@ def parse_clause(clause, compiler): """ from geoalchemy.base import SpatialElement, WKTSpatialElement, WKBSpatialElement, DBSpatialElement, GeometryBase - if hasattr(clause, '__clause_element__'): # for example a column name return clause.__clause_element__() @@ -27,7 +27,7 @@ def parse_clause(clause, compiler): if isinstance(clause, DBSpatialElement): return literal(clause.desc, GeometryBase) return clause.desc - elif isinstance(clause, basestring) and WKT_REGEX.match(clause): + elif isinstance(clause, six.string_types) and WKT_REGEX.match(clause): return WKTSpatialElement(clause) # for raw parameters @@ -117,7 +117,6 @@ def __call__(self, *arguments, **kwargs): if len(kwargs) > 0: self.flags.update(kwargs) - return self class ReturnsGeometryFunction(BaseFunction): @@ -148,7 +147,6 @@ def __compile_base_function(element, compiler, **kw): from geoalchemy.dialect import DialectManager database_dialect = DialectManager.get_spatial_dialect(compiler.dialect) - if database_dialect.is_member_function(element.__class__): geometry = params.pop(0) function_name = database_dialect.get_function(element.__class__) @@ -184,6 +182,7 @@ def __compile_base_function(element, compiler, **kw): ) else: + function = _get_function(element, compiler, params, kw.get('within_columns_clause', False)) return compiler.process(function) diff --git a/geoalchemy/geometry.py b/geoalchemy/geometry.py index 5b6d919..12ff6e3 100644 --- a/geoalchemy/geometry.py +++ b/geoalchemy/geometry.py @@ -157,7 +157,7 @@ class GeometryExtensionColumn(Column): @compiles(GeometryExtensionColumn) def compile_column(element, compiler, **kw): if isinstance(element.table, (Table, Alias)): - if kw.has_key("within_columns_clause") and kw["within_columns_clause"] == True: + if "within_columns_clause" in kw and kw["within_columns_clause"] == True: if element.type.wkt_internal: if isinstance(compiler.dialect, PGDialect): return compiler.process(functions.wkt(element)) @@ -181,7 +181,7 @@ def GeometryColumn(*args, **kw): set the properties for a geometry column when defining the mapping. """ - if kw.has_key("comparator"): + if 'comparator' in kw: comparator = kw.pop("comparator") else: comparator = SpatialComparator diff --git a/geoalchemy/mysql.py b/geoalchemy/mysql.py index a34a38f..fb87d59 100644 --- a/geoalchemy/mysql.py +++ b/geoalchemy/mysql.py @@ -1,6 +1,6 @@ from sqlalchemy import func from geoalchemy.base import SpatialComparator, PersistentSpatialElement,\ - WKBSpatialElement + WKBSpatialElement, WKTSpatialElement from geoalchemy.dialect import SpatialDialect from geoalchemy.functions import functions, BaseFunction @@ -12,7 +12,7 @@ def __getattr__(self, name): try: return SpatialComparator.__getattr__(self, name) except AttributeError: - return getattr(mysql_functions, name)(self) + return getattr(mysql_functions, name)(self.prop.columns[0]) class MySQLPersistentSpatialElement(PersistentSpatialElement): @@ -60,6 +60,15 @@ class mbr_contains(BaseFunction): """MBRContains(g1, g2)""" pass + class st_within(BaseFunction): + """ST_Within(g1, g2)""" + pass + + class st_contains(BaseFunction): + """ST_Within(g1, g2)""" + pass + + @staticmethod def _within_distance(compiler, geom1, geom2, distance, *args): """MySQL does not support the function distance, so we are doing @@ -92,6 +101,8 @@ class MySQLSpatialDialect(SpatialDialect): """Implementation of SpatialDialect for MySQL.""" __functions = { + WKTSpatialElement: 'ST_GeomFromText', + functions.wkb: 'ST_AsBinary', functions.length : 'GLength', functions.is_valid : None, functions.is_simple : None, @@ -113,6 +124,8 @@ class MySQLSpatialDialect(SpatialDialect): mysql_functions.mbr_within : 'MBRWithin', mysql_functions.mbr_overlaps : 'MBROverlaps', mysql_functions.mbr_contains : 'MBRContains', + mysql_functions.st_within: 'ST_Within', + mysql_functions.st_contains: 'ST_Contains', functions._within_distance : mysql_functions._within_distance } diff --git a/geoalchemy/oracle.py b/geoalchemy/oracle.py index 46f6ac1..ff54e46 100644 --- a/geoalchemy/oracle.py +++ b/geoalchemy/oracle.py @@ -93,7 +93,7 @@ def cast_param(params): params.pop(0) return func.ST_GEOMETRY(geom) - elif isinstance(geom, (WKBSpatialElement, WKTSpatialElement)) and geom.geometry_type <> Geometry.name: + elif isinstance(geom, (WKBSpatialElement, WKTSpatialElement)) and not geom.geometry_type == Geometry.name: params.pop(0) return getattr(func, 'ST_%s' % (geom.geometry_type))(geom) diff --git a/geoalchemy/tests/test_mssql.py b/geoalchemy/tests/test_mssql.py index 89f3828..6a7dc51 100644 --- a/geoalchemy/tests/test_mssql.py +++ b/geoalchemy/tests/test_mssql.py @@ -1,562 +1,562 @@ -# -*- coding: utf-8 -*- - -from sqlalchemy import (create_engine, MetaData, Column, Integer, String, - Numeric, func, Table, and_) -from sqlalchemy.orm import sessionmaker, mapper -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.exc import IntegrityError -from geoalchemy import GeometryColumn, Geometry, LineString, Polygon, GeometryDDL, GeometryExtensionColumn, GeometryCollection, DBSpatialElement, WKTSpatialElement, WKBSpatialElement -from geoalchemy.functions import functions -from geoalchemy.mssql import MS_SPATIAL_NULL, ms_functions, MSComparator -from unittest import TestCase -from nose.tools import eq_, ok_, raises, assert_almost_equal - -u""" -.. moduleauthor:: Mark Hall -""" - -engine = create_engine('mssql+pyodbc://gis:gis@localhost:4331/gis', echo=True) -metadata = MetaData(engine) -session = sessionmaker(bind=engine)() -Base = declarative_base(metadata=metadata) - -class Road(Base): - __tablename__ = 'ROADS' - - road_id = Column(Integer, primary_key=True) - road_name = Column(String(255)) - road_geom = GeometryColumn(LineString(2, bounding_box='(xmin=-180, ymin=-90, xmax=180, ymax=90)'), comparator=MSComparator, nullable=False) - -class Lake(Base): - __tablename__ = 'lakes' - - lake_id = Column(Integer, primary_key=True) - lake_name = Column(String(255)) - lake_geom = GeometryColumn(Polygon(2), comparator=MSComparator) - -spots_table = Table('spots', metadata, - Column('spot_id', Integer, primary_key=True), - Column('spot_height', Numeric(6, 2)), - GeometryExtensionColumn('spot_location', Geometry(2))) - -class Spot(object): - def __init__(self, spot_id=None, spot_height=None, spot_location=None): - self.spot_id = spot_id - self.spot_height = spot_height - self.spot_location = spot_location - - -mapper(Spot, spots_table, properties={ - 'spot_location': GeometryColumn(spots_table.c.spot_location, comparator=MSComparator)}) - -class Shape(Base): - __tablename__ = 'shapes' - - shape_id = Column(Integer, primary_key=True) - shape_name = Column(String(255)) - shape_geom = GeometryColumn(GeometryCollection(2)) - -# enable the DDL extension, which allows CREATE/DROP operations -# to work correctly. This is not needed if working with externally -# defined tables. -GeometryDDL(Road.__table__) -GeometryDDL(Lake.__table__) -GeometryDDL(spots_table) -GeometryDDL(Shape.__table__) - - -class TestGeometry(TestCase): - - def setUp(self): - metadata.drop_all() - metadata.create_all() - - session.add_all([ - Road(road_name='Jeff Rd', road_geom='LINESTRING(-88.9139332929936 42.5082802993631,-88.8203027197452 42.5985669235669,-88.7383759681529 42.7239650127389,-88.6113059044586 42.9680732929936,-88.3655256496815 43.1402866687898)'), - Road(road_name='Peter Rd', road_geom='LINESTRING(-88.9139332929936 42.5082802993631,-88.8203027197452 42.5985669235669,-88.7383759681529 42.7239650127389,-88.6113059044586 42.9680732929936,-88.3655256496815 43.1402866687898)'), - Road(road_name='Geordie Rd', road_geom='LINESTRING(-89.2232485796178 42.6420382611465,-89.2449842484076 42.9179140573248,-89.2316084522293 43.106847178344,-89.0710987261147 43.243949044586,-89.092834566879 43.2957802993631,-89.092834566879 43.2957802993631,-89.0309715095541 43.3175159681529)'), - Road(road_name='Paul St', road_geom='LINESTRING(-88.2652071783439 42.5584395350319,-88.1598727834395 42.6269904904459,-88.1013536751592 42.621974566879,-88.0244428471338 42.6437102356688,-88.0110670509554 42.6771497261147)'), - Road(road_name='Graeme Ave', road_geom='LINESTRING(-88.5477708726115 42.6988853949045,-88.6096339299363 42.9697452675159,-88.6029460318471 43.0884554585987,-88.5912422101911 43.187101955414)'), - Road(road_name='Phil Tce', road_geom='LINESTRING(-88.9356689617834 42.9363057770701,-88.9824842484076 43.0366242484076,-88.9222931656051 43.1085191528662,-88.8487262866242 43.0449841210191)'), - Lake(lake_name='My Lake', lake_geom='POLYGON((-88.7968950764331 43.2305732929936,-88.7935511273885 43.1553344394904,-88.716640299363 43.1570064140127,-88.7250001719745 43.2339172420382,-88.7968950764331 43.2305732929936))'), - Lake(lake_name='Lake White', lake_geom='POLYGON((-88.1147292993631 42.7540605095542,-88.1548566878981 42.7824840764331,-88.1799363057325 42.7707802547771,-88.188296178344 42.7323248407643,-88.1832802547771 42.6955414012739,-88.1565286624204 42.6771496815287,-88.1448248407643 42.6336783439491,-88.131449044586 42.5718152866242,-88.1013535031847 42.565127388535,-88.1080414012739 42.5868630573248,-88.1164012738854 42.6119426751592,-88.1080414012739 42.6520700636943,-88.0980095541401 42.6838375796178,-88.0846337579618 42.7139331210191,-88.1013535031847 42.7423566878981,-88.1147292993631 42.7540605095542))'), - Lake(lake_name='Lake Blue', lake_geom='POLYGON((-89.0694267515924 43.1335987261147,-89.1078821656051 43.1135350318471,-89.1329617834395 43.0884554140127,-89.1312898089172 43.0466560509554,-89.112898089172 43.0132165605096,-89.0694267515924 42.9898089171975,-89.0343152866242 42.953025477707,-89.0209394904459 42.9179140127389,-89.0042197452229 42.8961783439491,-88.9774681528663 42.8644108280255,-88.9440286624204 42.8292993630573,-88.9072452229299 42.8142515923567,-88.8687898089172 42.815923566879,-88.8687898089172 42.815923566879,-88.8102707006369 42.8343152866242,-88.7734872611465 42.8710987261147,-88.7517515923567 42.9145700636943,-88.7433917197452 42.9730891719745,-88.7517515923567 43.0299363057325,-88.7734872611465 43.0867834394905,-88.7885352038217 43.158678388535,-88.8738057324841 43.1620222929936,-88.947372611465 43.1937898089172,-89.0042197452229 43.2138535031847,-89.0410031847134 43.2389331210191,-89.0710987261147 43.243949044586,-89.0660828025478 43.2238853503185,-89.0543789808917 43.203821656051,-89.0376592356688 43.175398089172,-89.0292993630573 43.1519904458599,-89.0376592356688 43.1369426751592,-89.0393312101911 43.1386146496815,-89.0393312101911 43.1386146496815,-89.0510350318471 43.1335987261147,-89.0694267515924 43.1335987261147))'), - Lake(lake_name='Lake Deep', lake_geom='POLYGON((-88.9122611464968 43.038296178344,-88.9222929936306 43.0399681528663,-88.9323248407643 43.0282643312102,-88.9206210191083 43.0182324840764,-88.9105891719745 43.0165605095542,-88.9005573248408 43.0232484076433,-88.9072452229299 43.0282643312102,-88.9122611464968 43.038296178344))'), - Spot(spot_height=420.40, spot_location='POINT(-88.5945861592357 42.9480095987261)'), - Spot(spot_height=102.34, spot_location='POINT(-88.9055734203822 43.0048567324841)'), - Spot(spot_height=388.62, spot_location='POINT(-89.201512910828 43.1051752038217)'), - Spot(spot_height=454.66, spot_location='POINT(-88.3304141847134 42.6269904904459)'), - Shape(shape_name='Bus Stop', shape_geom='GEOMETRYCOLLECTION(POINT(-88.3304141847134 42.6269904904459))'), - Shape(shape_name='Jogging Track', shape_geom='GEOMETRYCOLLECTION(LINESTRING(-88.2652071783439 42.5584395350319,-88.1598727834395 42.6269904904459,-88.1013536751592 42.621974566879,-88.0244428471338 42.6437102356688,-88.0110670509554 42.6771497261147))'), - Shape(shape_name='Play Ground', shape_geom='GEOMETRYCOLLECTION(POLYGON((-88.7968950764331 43.2305732929936,-88.7935511273885 43.1553344394904,-88.716640299363 43.1570064140127,-88.7250001719745 43.2339172420382,-88.7968950764331 43.2305732929936)))'), - ]) - self.r = Road(road_name='Dave Cres', road_geom=WKTSpatialElement('LINESTRING(-88.6748409363057 43.1035032292994,-88.6464173694267 42.9981688343949,-88.607961955414 42.9680732929936,-88.5160033566879 42.9363057770701,-88.4390925286624 43.0031847579618)', 4326)) - session.add(self.r) - session.commit() - - def tearDown(self): - session.rollback() - metadata.drop_all() - - def test_geometry_type(self): - r = session.query(Road).get(1) - l = session.query(Lake).get(1) - s = session.query(Spot).get(1) - eq_(session.scalar(r.road_geom.geometry_type), 'LineString') - eq_(session.scalar(l.lake_geom.geometry_type), 'Polygon') - eq_(session.scalar(s.spot_location.geometry_type), 'Point') - eq_(session.scalar(functions.geometry_type(r.road_geom)), 'LineString') - ok_(session.query(Road).filter(Road.road_geom.geometry_type == 'LineString').first()) - - def test_wkt(self): - l = session.query(Lake).get(1) - assert session.scalar(self.r.road_geom.wkt) == 'LINESTRING (-88.6748409363057 43.1035032292994, -88.6464173694267 42.9981688343949, -88.607961955414 42.9680732929936, -88.5160033566879 42.9363057770701, -88.4390925286624 43.0031847579618)' - eq_(session.scalar(l.lake_geom.wkt),'POLYGON ((-88.7968950764331 43.2305732929936, -88.7935511273885 43.1553344394904, -88.716640299363 43.1570064140127, -88.7250001719745 43.2339172420382, -88.7968950764331 43.2305732929936))') - ok_(not session.query(Spot).filter(Spot.spot_location.wkt == 'POINT (0,0)').first()) - ok_(session.query(Spot).get(1) is - session.query(Spot).filter(Spot.spot_location == 'POINT (-88.5945861592357 42.9480095987261)').first()) - r = session.query(Road).get(1) - p = DBSpatialElement(session.scalar(r.road_geom.point_n(5))) - eq_(session.scalar(p.wkt), u'POINT (-88.3655256496815 43.1402866687898)') - eq_(session.scalar(WKTSpatialElement('POINT (-88.5769371859941 42.9915634871979)').wkt), u'POINT (-88.5769371859941 42.9915634871979)') - eq_(session.query(Spot.spot_location.wkt).filter(Spot.spot_id == 1).first(), (u'POINT (-88.5945861592357 42.9480095987261)',)) - - def test_coords(self): - eq_(self.r.road_geom.coords(session), [[-88.6748409363057,43.1035032292994],[-88.6464173694267,42.9981688343949],[-88.607961955414,42.9680732929936],[-88.5160033566879,42.9363057770701],[-88.4390925286624,43.0031847579618]]) - l = session.query(Lake).filter(Lake.lake_name=="Lake Deep").one() - eq_(l.lake_geom.coords(session), [[[-88.9122611464968,43.038296178344],[-88.9222929936306,43.0399681528663],[-88.9323248407643,43.0282643312102],[-88.9206210191083,43.0182324840764],[-88.9105891719745,43.0165605095542],[-88.9005573248408,43.0232484076433],[-88.9072452229299,43.0282643312102],[-88.9122611464968,43.038296178344]]]) - s = session.query(Spot).filter(Spot.spot_height==102.34).one() - eq_(s.spot_location.coords(session), [-88.905573420382197, 43.0048567324841]) - - def test_wkb(self): - eq_(session.scalar(WKBSpatialElement(session.scalar(self.r.road_geom.wkb)).wkt), - u'LINESTRING (-88.6748409363057 43.1035032292994, -88.6464173694267 42.9981688343949, -88.607961955414 42.9680732929936, -88.5160033566879 42.9363057770701, -88.4390925286624 43.0031847579618)') - eq_(session.scalar(self.r.road_geom.wkb), self.r.road_geom.geom_wkb) - ok_(not session.query(Spot).filter(Spot.spot_location.wkb == '101').first()) - centroid_geom = DBSpatialElement(session.scalar(session.query(Lake).first().lake_geom.centroid)) - eq_(session.scalar(WKBSpatialElement(session.scalar(centroid_geom.wkb)).wkt), u'POINT (-88.757840057564835 43.193797540630335)') - - @raises(AttributeError) - def test_svg(self): - eq_(session.scalar(self.r.road_geom.svg), 'M -88.674840936305699 -43.103503229299399 -88.6464173694267 -42.998168834394903 -88.607961955413998 -42.968073292993601 -88.516003356687904 -42.936305777070103 -88.4390925286624 -43.003184757961797') - ok_(self.r is session.query(Road).filter(Road.road_geom.svg == 'M -88.674840936305699 -43.103503229299399 -88.6464173694267 -42.998168834394903 -88.607961955413998 -42.968073292993601 -88.516003356687904 -42.936305777070103 -88.4390925286624 -43.003184757961797').first()) - eq_(session.scalar(func.svg('POINT(-88.9055734203822 43.0048567324841)')), u'cx="-88.905573420382197" cy="-43.0048567324841"') - ok_(session.query(Spot).filter(Spot.spot_location.svg == 'cx="-88.905573420382197" cy="-43.0048567324841"').first()) - - def test_gml(self): - eq_(session.scalar(self.r.road_geom.gml), '-88.6748409363057 43.1035032292994 -88.6464173694267 42.9981688343949 -88.607961955414 42.9680732929936 -88.5160033566879 42.9363057770701 -88.4390925286624 43.0031847579618') - - @raises(AttributeError) - def test_kml(self): - s = session.query(Spot).filter(Spot.spot_height==420.40).one() - eq_(session.scalar(s.spot_location.kml), u'-88.5945861592357,42.9480095987261') - - @raises(AttributeError) - def test_geojson(self): - s = session.query(Spot).filter(Spot.spot_height==420.40).one() - session.scalar(s.spot_location.geojson) - - def test_dimension(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - l = session.query(Lake).filter(Lake.lake_name=='My Lake').one() - eq_(session.scalar(r.road_geom.dimension), 1) - eq_(session.scalar(l.lake_geom.dimension), 2) - ok_(session.query(Spot).filter(Spot.spot_location.dimension == 0).first() is not None) - eq_(session.scalar(functions.dimension('POINT(-88.5945861592357 42.9480095987261)')), 0) - - def test_srid(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - eq_(session.scalar(r.road_geom.srid), 4326) - ok_(session.query(Spot).filter(Spot.spot_location.srid == 4326).first() is not None) - eq_(session.scalar(functions.srid('POINT(-88.5945861592357 42.9480095987261)')), 4326) - - def test_is_empty(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - l = session.query(Lake).filter(Lake.lake_name=='My Lake').one() - assert not session.scalar(r.road_geom.is_empty) - assert not session.scalar(l.lake_geom.is_empty) - ok_(session.query(Spot).filter(Spot.spot_location.is_empty == False).first() is not None) - eq_(session.scalar(functions.is_empty('POINT(-88.5945861592357 42.9480095987261)')), False) - - def test_is_simple(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - l = session.query(Lake).filter(Lake.lake_name=='My Lake').one() - assert session.scalar(r.road_geom.is_simple) - assert session.scalar(l.lake_geom.is_simple) - ok_(session.query(Spot).filter(Spot.spot_location.is_simple == True).first() is not None) - eq_(session.scalar(functions.is_simple('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1)')), False) - - def test_is_closed(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - l = session.query(Lake).filter(Lake.lake_name=='My Lake').one() - assert not session.scalar(r.road_geom.is_closed) - assert session.scalar(l.lake_geom.is_closed) - ok_(session.query(Lake).filter(Lake.lake_geom.is_closed == True).first() is not None) - eq_(session.scalar(functions.is_closed('LINESTRING(0 0, 1 1)')), False) - - def test_is_ring(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - assert not session.scalar(r.road_geom.is_ring) - ok_(session.query(Road).filter(Road.road_geom.is_ring == True).first() is None) - eq_(session.scalar(functions.is_ring('LINESTRING(0 0, 0 1, 1 0, 1 1, 0 0)')), False) - - def test_num_points(self): - l = session.query(Lake).get(1) - r = session.query(Road).get(1) - s = session.query(Spot).get(1) - ok_(session.scalar(l.lake_geom.num_points)) - eq_(session.scalar(r.road_geom.num_points), 5) - ok_(session.scalar(s.spot_location.num_points)) - ok_(session.query(Road).filter(Road.road_geom.num_points == 5).first() is not None) - eq_(session.scalar(functions.num_points('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')), 4) - - def test_point_n(self): - l = session.query(Lake).get(1) - r = session.query(Road).get(1) - ok_(session.scalar(l.lake_geom.point_n(1))) - ok_(session.query(Road).filter(Road.road_geom.point_n(5) == WKTSpatialElement('POINT(-88.3655256496815 43.1402866687898)')).first() is not None) - eq_(session.scalar(functions.wkt(r.road_geom.point_n(5))), u'POINT (-88.3655256496815 43.1402866687898)') - eq_(session.scalar(functions.wkt(functions.point_n('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)', 1))) - , u'POINT (77.29 29.07)') - - def test_persistent(self): - eq_(session.scalar(self.r.road_geom.wkt), - u'LINESTRING (-88.6748409363057 43.1035032292994, -88.6464173694267 42.9981688343949, -88.607961955414 42.9680732929936, -88.5160033566879 42.9363057770701, -88.4390925286624 43.0031847579618)') - - def test_eq(self): - r1 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - r2 = session.query(Road).filter(Road.road_geom == 'LINESTRING(-88.5477708726115 42.6988853949045,-88.6096339299363 42.9697452675159,-88.6029460318471 43.0884554585987,-88.5912422101911 43.187101955414)').one() - r3 = session.query(Road).filter(Road.road_geom == r1.road_geom).one() - ok_(r1 is r2 is r3) - - def test_length(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - assert_almost_equal(session.scalar(r.road_geom.length), 0.496071476676014) - ok_(session.query(Road).filter(Road.road_geom.length > 0).first() is not None) - assert_almost_equal(session.scalar(functions.length('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')), 0.62916306324869398) - - def test_area(self): - l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() - assert_almost_equal(session.scalar(l.lake_geom.area), 0.10475991566721) - ok_(session.query(Lake).filter(Lake.lake_geom.area > 0).first() is not None) - assert_almost_equal(session.scalar(functions.area(WKTSpatialElement('POLYGON((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416))',2249))), - 928.625) - - def test_x(self): - s = session.query(Spot).filter(Spot.spot_height==420.40).one() - eq_(session.scalar(s.spot_location.x), -88.5945861592357) - s = session.query(Spot).filter(and_(Spot.spot_location.x < 0, Spot.spot_location.y > 42)).all() - ok_(s is not None) - eq_(session.scalar(functions.x('POINT(-88.3655256496815 43.1402866687898)')), -88.3655256496815) - - def test_y(self): - s = session.query(Spot).filter(Spot.spot_height==420.40).one() - eq_(session.scalar(s.spot_location.y), 42.9480095987261) - s = session.query(Spot).filter(and_(Spot.spot_location.y < 0, Spot.spot_location.y > 42)).all() - ok_(s is not None) - eq_(session.scalar(functions.y('POINT(-88.3655256496815 43.1402866687898)')), 43.1402866687898) - - def test_centroid(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() - ok_(not session.scalar(functions.wkt(r.road_geom.centroid))) - eq_(session.scalar(functions.wkt(l.lake_geom.centroid)), u'POINT (-88.921453826951719 43.019149768468026)') - ok_(session.query(Spot).filter(Spot.spot_location.centroid == WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)')).first() is None) - ok_(session.scalar(functions.wkt(functions.centroid('MULTIPOINT ( -1 0, -1 2, -1 3, -1 4, -1 7, 0 1, 0 3, 1 1, 2 0, 6 0, 7 8, 9 8, 10 6 )'))) is None) - - def test_boundary(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - eq_(session.scalar(functions.wkt(r.road_geom.boundary)), u'MULTIPOINT ((-88.5912422100082 43.187101952731609), (-88.547770872712135 42.698885396122932))') - ok_(session.query(Road).filter(Road.road_geom.boundary == WKTSpatialElement('MULTIPOINT ((-88.5912422100082 43.187101952731609), (-88.547770872712135 42.698885396122932))')).first() is not None) - eq_(session.scalar(functions.wkt(functions.boundary('POLYGON((1 1,0 0, -1 1, 1 1))'))), - u'LINESTRING (0 0, 1 1, -1 1, 0 0)') - - def test_buffer(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - assert_almost_equal(session.scalar(functions.area(r.road_geom.buffer(10.0))), 323.99187776147323) - ok_(session.query(Spot).filter(functions.within('POINT(-88.5945861592357 42.9480095987261)', Spot.spot_location.buffer(10))).first() is not None) - assert_almost_equal(session.scalar(functions.area(functions.buffer('POINT(-88.5945861592357 42.9480095987261)', 10))), 314.12087152405275) - - def test_convex_hull(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - eq_(session.scalar(functions.wkt(r.road_geom.convex_hull)), - u'POLYGON ((-88.547770872712135 42.698885396122932, -88.5912422100082 43.187101952731609, -88.602946031838655 43.088455460965633, -88.609633930027485 42.969745270907879, -88.547770872712135 42.698885396122932))') - ok_(session.query(Spot).filter(Spot.spot_location.convex_hull == WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)')).first() is not None) - eq_(session.scalar(functions.wkt(functions.convex_hull('POINT(-88.5945861592357 42.9480095987261)'))), - u'POINT (-88.594586159235689 42.948009598726117)') - - def test_envelope(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - eq_(session.scalar(functions.wkt(r.road_geom.envelope)), - u'POLYGON ((-88.6096339299363 42.6988853949045, -88.5477708726115 42.6988853949045, -88.5477708726115 43.187101955414, -88.6096339299363 43.187101955414, -88.6096339299363 42.6988853949045))') - eq_(session.scalar(functions.geometry_type(self.r.road_geom.envelope)), 'Polygon') - ok_(session.query(Spot).filter(Spot.spot_location.envelope == WKTSpatialElement('POLYGON ((-88.9055744203822 43.0048557324841, -88.9055724203822 43.0048557324841, -88.9055724203822 43.0048577324841, -88.9055744203822 43.0048577324841, -88.9055744203822 43.0048557324841))')).first() is not None) - eq_(session.scalar(functions.wkt(functions.envelope('POINT(-88.5945861592357 42.9480095987261)'))), - u'POLYGON ((-88.5945871592357 42.948008598726105, -88.5945851592357 42.948008598726105, -88.5945851592357 42.9480105987261, -88.5945871592357 42.9480105987261, -88.5945871592357 42.948008598726105))') - - def test_start_point(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - eq_(session.scalar(functions.wkt(r.road_geom.start_point)), - u'POINT (-88.5477708726115 42.6988853949045)') - ok_(session.query(Road).filter(Road.road_geom.start_point == WKTSpatialElement('POINT(-88.9139332929936 42.5082802993631)')).first() is not None) - eq_(session.scalar(functions.wkt(functions.start_point('LINESTRING(0 1, 0 2)'))), - u'POINT (0 1)') - - def test_end_point(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - eq_(session.scalar(functions.wkt(r.road_geom.end_point)), - u'POINT (-88.5912422101911 43.187101955414)') - ok_(session.query(Road).filter(Road.road_geom.end_point == WKTSpatialElement('POINT(-88.3655256496815 43.1402866687898)')).first() is not None) - eq_(session.scalar(functions.wkt(functions.end_point('LINESTRING(0 1, 0 2)'))), - u'POINT (0 2)') - - @raises(NotImplementedError) - def test_transform(self): - spot = session.query(Spot).get(1) - # compare the coordinates using a tolerance, because they may vary on different systems - assert_almost_equal(session.scalar(functions.x(spot.spot_location.transform(2249))), -3890517.6109559298) - assert_almost_equal(session.scalar(functions.y(spot.spot_location.transform(2249))), 3627658.6746507999) - ok_(session.query(Spot).filter(Spot.spot_location.transform(2249) == WKTSpatialElement('POINT(-3890517.61095593 3627658.6746508)', 2249)).first() is not None) - eq_(session.scalar(functions.wkt(functions.transform(WKTSpatialElement('POLYGON((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416))', 2249), 4326))), - u'POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326 42.3903829478009,-71.1775844305465 42.3903826677917,-71.1775825927231 42.3902893647987,-71.1776848522251 42.3902896512902))') - - # Test Geometry Relationships - - def test_equals(self): - r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name=='Peter Rd').one() - r3 = session.query(Road).filter(Road.road_name=='Paul St').one() - equal_roads = session.query(Road).filter(Road.road_geom.equals(r1.road_geom)).all() - ok_(r1 in equal_roads) - ok_(r2 in equal_roads) - ok_(r3 not in equal_roads) - ok_(session.query(Spot).filter(Spot.spot_location.equals(WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)'))).first() is not None) - eq_(session.scalar(functions.equals('POINT(-88.5945861592357 42.9480095987261)', 'POINT(-88.5945861592357 42.9480095987261)')), True) - - def test_distance(self): - r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() - r3 = session.query(Road).filter(Road.road_name=='Peter Rd').one() - assert_almost_equal(session.scalar(r1.road_geom.distance(r2.road_geom)), 0.336997238682841) - eq_(session.scalar(r1.road_geom.distance(r3.road_geom)), 0.0) - ok_(session.query(Spot).filter(Spot.spot_location.distance(WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)')) < 10).first() is not None) - assert_almost_equal(session.scalar(functions.distance('POINT(-88.5945861592357 42.9480095987261)', 'POINT(-88.5945861592357 42.9480095987261)')), 0) - - @raises(NotImplementedError) - def test_within_distance(self): - r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() - roads_within_distance = session.query(Road).filter( - Road.road_geom.within_distance(r1.road_geom, 0.20)).all() - ok_(r2 in roads_within_distance) - ok_(r3 not in roads_within_distance) - eq_(session.scalar(functions.within_distance('POINT(-88.9139332929936 42.5082802993631)', 'POINT(-88.9139332929936 35.5082802993631)', 10)), True) - - def test_disjoint(self): - r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() - disjoint_roads = session.query(Road).filter(Road.road_geom.disjoint(r1.road_geom)).all() - ok_(r2 not in disjoint_roads) - ok_(r3 in disjoint_roads) - eq_(session.scalar(functions.disjoint('POINT(0 0)', 'LINESTRING ( 2 0, 0 2 )')), True) - - - def test_intersects(self): - r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() - intersecting_roads = session.query(Road).filter(Road.road_geom.intersects(r1.road_geom)).all() - ok_(r2 in intersecting_roads) - ok_(r3 not in intersecting_roads) - eq_(session.scalar(functions.intersects('POINT(0 0)', 'LINESTRING ( 2 0, 0 2 )')), False) - - def test_touches(self): - l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() - l2 = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() - r = session.query(Road).filter(Road.road_name=='Geordie Rd').one() - touching_lakes = session.query(Lake).filter(Lake.lake_geom.touches(r.road_geom)).all() - ok_(not session.scalar(l1.lake_geom.touches(r.road_geom))) - ok_(session.scalar(l2.lake_geom.touches(r.road_geom))) - ok_(l1 not in touching_lakes) - ok_(l2 in touching_lakes) - eq_(session.scalar(functions.touches('POINT(1 1)', 'LINESTRING (0 0, 1 1, 0 2)')), False) - - def test_crosses(self): - r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name=='Paul St').one() - l = session.query(Lake).filter(Lake.lake_name=='Lake White').one() - crossing_roads = session.query(Road).filter(Road.road_geom.crosses(l.lake_geom)).all() - ok_(not session.scalar(r1.road_geom.crosses(l.lake_geom))) - ok_(session.scalar(r2.road_geom.crosses(l.lake_geom))) - ok_(r1 not in crossing_roads) - ok_(r2 in crossing_roads) - eq_(session.scalar(functions.crosses('LINESTRING(0 1, 2 1)', 'LINESTRING (0 0, 1 2, 0 2)')), True) - - def test_within(self): - l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() - p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() - p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() - spots_within = session.query(Spot).filter(Spot.spot_location.within(l.lake_geom)).all() - ok_(session.scalar(p1.spot_location.within(l.lake_geom))) - ok_(not session.scalar(p2.spot_location.within(l.lake_geom))) - ok_(p1 in spots_within) - ok_(p2 not in spots_within) - eq_(session.scalar(functions.within('LINESTRING(0 1, 2 1)', 'POLYGON((-1 -1, 3 -1, 3 2, -1 2, -1 -1))')), True) - buffer_geom = DBSpatialElement(session.scalar(l.lake_geom.buffer(10.0))) - spots_within = session.query(Spot).filter(l.lake_geom.within(buffer_geom)).all() - ok_(p1 in spots_within) - ok_(p2 in spots_within) - - def test_overlaps(self): - l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() - l2 = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() - l3 = session.query(Lake).filter(Lake.lake_name=='My Lake').one() - overlapping_lakes = session.query(Lake).filter(Lake.lake_geom.overlaps(l3.lake_geom)).all() - ok_(not session.scalar(l1.lake_geom.overlaps(l3.lake_geom))) - ok_(session.scalar(l2.lake_geom.overlaps(l3.lake_geom))) - ok_(l1 not in overlapping_lakes) - ok_(l2 in overlapping_lakes) - eq_(session.scalar(functions.overlaps('POLYGON((2 1, 4 1, 4 3, 2 3, 2 1))', 'POLYGON((-1 -1, 3 -1, 3 2, -1 2, -1 -1))')), True) - - def test_contains(self): - l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() - l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() - p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() - p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() - containing_lakes = session.query(Lake).filter(Lake.lake_geom.gcontains(p1.spot_location)).all() - ok_(session.scalar(l.lake_geom.gcontains(p1.spot_location))) - ok_(not session.scalar(l.lake_geom.gcontains(p2.spot_location))) - ok_(l in containing_lakes) - ok_(l1 not in containing_lakes) - ok_(session.scalar(l.lake_geom.gcontains(WKTSpatialElement('POINT(-88.9055734203822 43.0048567324841)')))) - containing_lakes = session.query(Lake).filter(Lake.lake_geom.gcontains('POINT(-88.9055734203822 43.0048567324841)')).all() - ok_(l in containing_lakes) - ok_(l1 not in containing_lakes) - spots_within = session.query(Spot).filter(l.lake_geom.gcontains(Spot.spot_location)).all() - ok_(session.scalar(l.lake_geom.gcontains(p1.spot_location))) - ok_(not session.scalar(l.lake_geom.gcontains(p2.spot_location))) - ok_(p1 in spots_within) - ok_(p2 not in spots_within) - eq_(session.scalar(functions.gcontains('LINESTRING(0 1, 2 1)', 'POLYGON((-1 -1, 3 -1, 3 2, -1 2, -1 -1))')), False) - - @raises(NotImplementedError) - def test_covers(self): - l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() - l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() - p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() - p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() - covering_lakes = session.query(Lake).filter(Lake.lake_geom.covers(p1.spot_location)).all() - ok_(session.scalar(l.lake_geom.covers(p1.spot_location))) - ok_(not session.scalar(l.lake_geom.covers(p2.spot_location))) - ok_(l in covering_lakes) - ok_(l1 not in covering_lakes) - eq_(session.scalar(functions.gcontains('LINESTRING(0 1, 2 1)', 'POLYGON((-1 -1, 3 -1, 3 2, -1 2, -1 -1))')), False) - - @raises(NotImplementedError) - def test_covered_by(self): - l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() - p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() - p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() - covered_spots = session.query(Spot).filter(Spot.spot_location.covered_by(l.lake_geom)).all() - ok_(session.scalar(p1.spot_location.covered_by(l.lake_geom))) - ok_(not session.scalar(p2.spot_location.covered_by(l.lake_geom))) - ok_(p1 in covered_spots) - ok_(p2 not in covered_spots) - eq_(session.scalar(functions.covered_by('LINESTRING(0 1, 2 1)', 'POLYGON((-1 -1, 3 -1, 3 2, -1 2, -1 -1))')), True) - - @raises(NotImplementedError) - def test_intersection(self): - l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() - r = session.query(Road).filter(Road.road_name=='Geordie Rd').one() - s = session.query(Spot).filter(Spot.spot_height==454.66).one() - eq_(session.scalar(func.STAsText(l.lake_geom.intersection(s.spot_location))), 'GEOMETRYCOLLECTION EMPTY') - eq_(session.scalar(func.STAsText(session.scalar(l.lake_geom.intersection(r.road_geom)))), 'POINT(-89.0710987261147 43.243949044586)') - l = session.query(Lake).filter(Lake.lake_name=='Lake White').one() - r = session.query(Road).filter(Road.road_name=='Paul St').one() - eq_(session.scalar(func.STAsText(session.scalar(l.lake_geom.intersection(r.road_geom)))), 'LINESTRING(-88.1430673666454 42.6255500261493,-88.1140839697546 42.6230657349872)') - ok_(session.query(Lake).filter(Lake.lake_geom.intersection(r.road_geom) == WKTSpatialElement('LINESTRING(-88.1430673666454 42.6255500261493,-88.1140839697546 42.6230657349872)')).first() is not None) - - @raises(IntegrityError) - def test_constraint_nullable(self): - spot_null = Spot(spot_height=420.40, spot_location=MS_SPATIAL_NULL) - session.add(spot_null) - session.commit(); - ok_(True) - road_null = Road(road_name='Jeff Rd', road_geom=MS_SPATIAL_NULL) - session.add(road_null) - session.commit(); - - # Test SQL Server specific functions - - def test_text_zm(self): - engine.execute('INSERT INTO [spots] VALUES(%f, geometry::STGeomFromText(%s, %i))' % (130.23, "'POINT (-88.5945861592357 42.9480095987261 130.23 1)'", 4326)) - eq_(session.query(Spot.spot_location.text_zm.label('text_zm')).filter(Spot.spot_height==130.23).first().text_zm, u'POINT (-88.5945861592357 42.9480095987261 130.23 1)') - eq_(session.query(Spot.spot_location.text_zm.label('text_zm')).filter(Spot.spot_height==420.40).first().text_zm, u'POINT (-88.5945861592357 42.9480095987261)') - - - def test_buffer_with_tolerance(self): - r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - assert_almost_equal(session.scalar(functions.area(r.road_geom.buffer_with_tolerance(10.0, 20, 1))), 214.63894668789601) - assert_almost_equal(session.scalar(functions.area(r.road_geom.buffer_with_tolerance(10.0, 20, 0))), 214.63894668789601) - ok_(session.query(Spot).filter(functions.within('POINT(-88.5945861592357 42.9480095987261)', Spot.spot_location.buffer(10))).first() is not None) - assert_almost_equal(session.scalar(functions.area(ms_functions.buffer_with_tolerance('POINT(-88.5945861592357 42.9480095987261)', 10, 2, 0))), 306.21843345678644) - - def test_filter(self): - r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() - intersecting_roads = session.query(Road).filter(Road.road_geom.filter(r1.road_geom)).all() - ok_(r2 in intersecting_roads) - ok_(r3 not in intersecting_roads) - eq_(session.scalar(ms_functions.filter('POINT(0 0)', 'LINESTRING ( 2 0, 0 2 )')), False) - - def test_instance_of(self): - ok_(session.query(Road).filter(Road.road_geom.instance_of('LINESTRING')).first() is not None) - ok_(session.query(Lake).filter(Lake.lake_geom.instance_of('POLYGON')).first() is not None) - ok_(session.query(Spot).filter(Spot.spot_location.instance_of('POINT')).first() is not None) - - def test_extended_coords(self): - engine.execute('INSERT INTO [spots] VALUES(%f, geometry::STGeomFromText(%s, %i))' % (130.23, "'POINT (-88.5945861592357 42.9480095987261 130.23 1)'", 4326)) - p = session.query(Spot.spot_location.z.label('z'), Spot.spot_location.m.label('m')).filter(Spot.spot_height==130.23).first() - eq_(p.z, 130.23) - eq_(p.m, 1) - p = session.query(Spot.spot_location.z.label('z'), Spot.spot_location.m.label('m')).filter(Spot.spot_height==420.40).first() - ok_(p.z is None) - ok_(p.m is None) - - def test_make_valid(self): - session.add(Shape(shape_name=u'Invalid Shape', shape_geom=WKTSpatialElement(u'LINESTRING(0 2, 1 1, 1 0, 1 1, 2 2)'))) - invalid_line = session.query(Shape).filter(Shape.shape_name==u'Invalid Shape').first() - eq_(session.scalar(invalid_line.shape_geom.is_valid), 0) - invalid_line.shape_geom = DBSpatialElement(session.scalar(invalid_line.shape_geom.make_valid)) - valid_line = session.query(Shape).filter(Shape.shape_name==u'Invalid Shape').first() - eq_(session.scalar(valid_line.shape_geom.is_valid), 1) - - - def test_reduce(self): - r = session.query(Road).first() - eq_(session.scalar(DBSpatialElement(session.scalar(r.road_geom.reduce(0.5))).wkt), - u'LINESTRING (-88.9139332929936 42.5082802993631, -88.3655256496815 43.1402866687898)') - eq_(session.scalar(DBSpatialElement(session.scalar(r.road_geom.reduce(0.05))).wkt), - u'LINESTRING (-88.9139332929936 42.5082802993631, -88.6113059044586 42.9680732929936, -88.3655256496815 43.1402866687898)') - eq_(session.scalar(DBSpatialElement(session.scalar(r.road_geom.reduce(0.0000000000001))).wkt), - session.scalar(r.road_geom.wkt)) - - - def test_to_string(self): - engine.execute('INSERT INTO [spots] VALUES(%f, geometry::STGeomFromText(%s, %i))' % (130.23, "'POINT (-88.5945861592357 42.9480095987261 130.23 1)'", 4326)) - session.add(Lake(lake_name=u'Vanished lake', lake_geom=MS_SPATIAL_NULL)) - eq_(session.query(Spot.spot_location.text_zm.label('to_string')).filter(Spot.spot_height==130.23).first().to_string, u'POINT (-88.5945861592357 42.9480095987261 130.23 1)') - eq_(session.query(Spot.spot_location.text_zm.label('to_string')).filter(Spot.spot_height==420.40).first().to_string, u'POINT (-88.5945861592357 42.9480095987261)') - ok_(session.query(Lake.lake_geom.to_string.label('to_string')).filter(Lake.lake_name==u'Vanished lake').first().to_string is None) - - -if __name__ == '__main__': - import sys - import nose - - sys.argv.append(__name__) - result = nose.run() - sys.exit(int(not result)) +# -*- coding: utf-8 -*- + +from sqlalchemy import (create_engine, MetaData, Column, Integer, String, + Numeric, func, Table, and_) +from sqlalchemy.orm import sessionmaker, mapper +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.exc import IntegrityError +from geoalchemy import GeometryColumn, Geometry, LineString, Polygon, GeometryDDL, GeometryExtensionColumn, GeometryCollection, DBSpatialElement, WKTSpatialElement, WKBSpatialElement +from geoalchemy.functions import functions +from geoalchemy.mssql import MS_SPATIAL_NULL, ms_functions, MSComparator +from unittest import TestCase +from nose.tools import eq_, ok_, raises, assert_almost_equal + +""" +.. moduleauthor:: Mark Hall +""" + +engine = create_engine('mssql+pyodbc://gis:gis@localhost:4331/gis', echo=True) +metadata = MetaData(engine) +session = sessionmaker(bind=engine)() +Base = declarative_base(metadata=metadata) + +class Road(Base): + __tablename__ = 'ROADS' + + road_id = Column(Integer, primary_key=True) + road_name = Column(String(255)) + road_geom = GeometryColumn(LineString(2, bounding_box='(xmin=-180, ymin=-90, xmax=180, ymax=90)'), comparator=MSComparator, nullable=False) + +class Lake(Base): + __tablename__ = 'lakes' + + lake_id = Column(Integer, primary_key=True) + lake_name = Column(String(255)) + lake_geom = GeometryColumn(Polygon(2), comparator=MSComparator) + +spots_table = Table('spots', metadata, + Column('spot_id', Integer, primary_key=True), + Column('spot_height', Numeric(6, 2)), + GeometryExtensionColumn('spot_location', Geometry(2))) + +class Spot(object): + def __init__(self, spot_id=None, spot_height=None, spot_location=None): + self.spot_id = spot_id + self.spot_height = spot_height + self.spot_location = spot_location + + +mapper(Spot, spots_table, properties={ + 'spot_location': GeometryColumn(spots_table.c.spot_location, comparator=MSComparator)}) + +class Shape(Base): + __tablename__ = 'shapes' + + shape_id = Column(Integer, primary_key=True) + shape_name = Column(String(255)) + shape_geom = GeometryColumn(GeometryCollection(2)) + +# enable the DDL extension, which allows CREATE/DROP operations +# to work correctly. This is not needed if working with externally +# defined tables. +GeometryDDL(Road.__table__) +GeometryDDL(Lake.__table__) +GeometryDDL(spots_table) +GeometryDDL(Shape.__table__) + + +class TestGeometry(TestCase): + + def setUp(self): + metadata.drop_all() + metadata.create_all() + + session.add_all([ + Road(road_name='Jeff Rd', road_geom='LINESTRING(-88.9139332929936 42.5082802993631,-88.8203027197452 42.5985669235669,-88.7383759681529 42.7239650127389,-88.6113059044586 42.9680732929936,-88.3655256496815 43.1402866687898)'), + Road(road_name='Peter Rd', road_geom='LINESTRING(-88.9139332929936 42.5082802993631,-88.8203027197452 42.5985669235669,-88.7383759681529 42.7239650127389,-88.6113059044586 42.9680732929936,-88.3655256496815 43.1402866687898)'), + Road(road_name='Geordie Rd', road_geom='LINESTRING(-89.2232485796178 42.6420382611465,-89.2449842484076 42.9179140573248,-89.2316084522293 43.106847178344,-89.0710987261147 43.243949044586,-89.092834566879 43.2957802993631,-89.092834566879 43.2957802993631,-89.0309715095541 43.3175159681529)'), + Road(road_name='Paul St', road_geom='LINESTRING(-88.2652071783439 42.5584395350319,-88.1598727834395 42.6269904904459,-88.1013536751592 42.621974566879,-88.0244428471338 42.6437102356688,-88.0110670509554 42.6771497261147)'), + Road(road_name='Graeme Ave', road_geom='LINESTRING(-88.5477708726115 42.6988853949045,-88.6096339299363 42.9697452675159,-88.6029460318471 43.0884554585987,-88.5912422101911 43.187101955414)'), + Road(road_name='Phil Tce', road_geom='LINESTRING(-88.9356689617834 42.9363057770701,-88.9824842484076 43.0366242484076,-88.9222931656051 43.1085191528662,-88.8487262866242 43.0449841210191)'), + Lake(lake_name='My Lake', lake_geom='POLYGON((-88.7968950764331 43.2305732929936,-88.7935511273885 43.1553344394904,-88.716640299363 43.1570064140127,-88.7250001719745 43.2339172420382,-88.7968950764331 43.2305732929936))'), + Lake(lake_name='Lake White', lake_geom='POLYGON((-88.1147292993631 42.7540605095542,-88.1548566878981 42.7824840764331,-88.1799363057325 42.7707802547771,-88.188296178344 42.7323248407643,-88.1832802547771 42.6955414012739,-88.1565286624204 42.6771496815287,-88.1448248407643 42.6336783439491,-88.131449044586 42.5718152866242,-88.1013535031847 42.565127388535,-88.1080414012739 42.5868630573248,-88.1164012738854 42.6119426751592,-88.1080414012739 42.6520700636943,-88.0980095541401 42.6838375796178,-88.0846337579618 42.7139331210191,-88.1013535031847 42.7423566878981,-88.1147292993631 42.7540605095542))'), + Lake(lake_name='Lake Blue', lake_geom='POLYGON((-89.0694267515924 43.1335987261147,-89.1078821656051 43.1135350318471,-89.1329617834395 43.0884554140127,-89.1312898089172 43.0466560509554,-89.112898089172 43.0132165605096,-89.0694267515924 42.9898089171975,-89.0343152866242 42.953025477707,-89.0209394904459 42.9179140127389,-89.0042197452229 42.8961783439491,-88.9774681528663 42.8644108280255,-88.9440286624204 42.8292993630573,-88.9072452229299 42.8142515923567,-88.8687898089172 42.815923566879,-88.8687898089172 42.815923566879,-88.8102707006369 42.8343152866242,-88.7734872611465 42.8710987261147,-88.7517515923567 42.9145700636943,-88.7433917197452 42.9730891719745,-88.7517515923567 43.0299363057325,-88.7734872611465 43.0867834394905,-88.7885352038217 43.158678388535,-88.8738057324841 43.1620222929936,-88.947372611465 43.1937898089172,-89.0042197452229 43.2138535031847,-89.0410031847134 43.2389331210191,-89.0710987261147 43.243949044586,-89.0660828025478 43.2238853503185,-89.0543789808917 43.203821656051,-89.0376592356688 43.175398089172,-89.0292993630573 43.1519904458599,-89.0376592356688 43.1369426751592,-89.0393312101911 43.1386146496815,-89.0393312101911 43.1386146496815,-89.0510350318471 43.1335987261147,-89.0694267515924 43.1335987261147))'), + Lake(lake_name='Lake Deep', lake_geom='POLYGON((-88.9122611464968 43.038296178344,-88.9222929936306 43.0399681528663,-88.9323248407643 43.0282643312102,-88.9206210191083 43.0182324840764,-88.9105891719745 43.0165605095542,-88.9005573248408 43.0232484076433,-88.9072452229299 43.0282643312102,-88.9122611464968 43.038296178344))'), + Spot(spot_height=420.40, spot_location='POINT(-88.5945861592357 42.9480095987261)'), + Spot(spot_height=102.34, spot_location='POINT(-88.9055734203822 43.0048567324841)'), + Spot(spot_height=388.62, spot_location='POINT(-89.201512910828 43.1051752038217)'), + Spot(spot_height=454.66, spot_location='POINT(-88.3304141847134 42.6269904904459)'), + Shape(shape_name='Bus Stop', shape_geom='GEOMETRYCOLLECTION(POINT(-88.3304141847134 42.6269904904459))'), + Shape(shape_name='Jogging Track', shape_geom='GEOMETRYCOLLECTION(LINESTRING(-88.2652071783439 42.5584395350319,-88.1598727834395 42.6269904904459,-88.1013536751592 42.621974566879,-88.0244428471338 42.6437102356688,-88.0110670509554 42.6771497261147))'), + Shape(shape_name='Play Ground', shape_geom='GEOMETRYCOLLECTION(POLYGON((-88.7968950764331 43.2305732929936,-88.7935511273885 43.1553344394904,-88.716640299363 43.1570064140127,-88.7250001719745 43.2339172420382,-88.7968950764331 43.2305732929936)))'), + ]) + self.r = Road(road_name='Dave Cres', road_geom=WKTSpatialElement('LINESTRING(-88.6748409363057 43.1035032292994,-88.6464173694267 42.9981688343949,-88.607961955414 42.9680732929936,-88.5160033566879 42.9363057770701,-88.4390925286624 43.0031847579618)', 4326)) + session.add(self.r) + session.commit() + + def tearDown(self): + session.rollback() + metadata.drop_all() + + def test_geometry_type(self): + r = session.query(Road).get(1) + l = session.query(Lake).get(1) + s = session.query(Spot).get(1) + eq_(session.scalar(r.road_geom.geometry_type), 'LineString') + eq_(session.scalar(l.lake_geom.geometry_type), 'Polygon') + eq_(session.scalar(s.spot_location.geometry_type), 'Point') + eq_(session.scalar(functions.geometry_type(r.road_geom)), 'LineString') + ok_(session.query(Road).filter(Road.road_geom.geometry_type == 'LineString').first()) + + def test_wkt(self): + l = session.query(Lake).get(1) + assert session.scalar(self.r.road_geom.wkt) == 'LINESTRING (-88.6748409363057 43.1035032292994, -88.6464173694267 42.9981688343949, -88.607961955414 42.9680732929936, -88.5160033566879 42.9363057770701, -88.4390925286624 43.0031847579618)' + eq_(session.scalar(l.lake_geom.wkt),'POLYGON ((-88.7968950764331 43.2305732929936, -88.7935511273885 43.1553344394904, -88.716640299363 43.1570064140127, -88.7250001719745 43.2339172420382, -88.7968950764331 43.2305732929936))') + ok_(not session.query(Spot).filter(Spot.spot_location.wkt == 'POINT (0,0)').first()) + ok_(session.query(Spot).get(1) is + session.query(Spot).filter(Spot.spot_location == 'POINT (-88.5945861592357 42.9480095987261)').first()) + r = session.query(Road).get(1) + p = DBSpatialElement(session.scalar(r.road_geom.point_n(5))) + eq_(session.scalar(p.wkt), 'POINT (-88.3655256496815 43.1402866687898)') + eq_(session.scalar(WKTSpatialElement('POINT (-88.5769371859941 42.9915634871979)').wkt), 'POINT (-88.5769371859941 42.9915634871979)') + eq_(session.query(Spot.spot_location.wkt).filter(Spot.spot_id == 1).first(), ('POINT (-88.5945861592357 42.9480095987261)',)) + + def test_coords(self): + eq_(self.r.road_geom.coords(session), [[-88.6748409363057,43.1035032292994],[-88.6464173694267,42.9981688343949],[-88.607961955414,42.9680732929936],[-88.5160033566879,42.9363057770701],[-88.4390925286624,43.0031847579618]]) + l = session.query(Lake).filter(Lake.lake_name=="Lake Deep").one() + eq_(l.lake_geom.coords(session), [[[-88.9122611464968,43.038296178344],[-88.9222929936306,43.0399681528663],[-88.9323248407643,43.0282643312102],[-88.9206210191083,43.0182324840764],[-88.9105891719745,43.0165605095542],[-88.9005573248408,43.0232484076433],[-88.9072452229299,43.0282643312102],[-88.9122611464968,43.038296178344]]]) + s = session.query(Spot).filter(Spot.spot_height==102.34).one() + eq_(s.spot_location.coords(session), [-88.905573420382197, 43.0048567324841]) + + def test_wkb(self): + eq_(session.scalar(WKBSpatialElement(session.scalar(self.r.road_geom.wkb)).wkt), + 'LINESTRING (-88.6748409363057 43.1035032292994, -88.6464173694267 42.9981688343949, -88.607961955414 42.9680732929936, -88.5160033566879 42.9363057770701, -88.4390925286624 43.0031847579618)') + eq_(session.scalar(self.r.road_geom.wkb), self.r.road_geom.geom_wkb) + ok_(not session.query(Spot).filter(Spot.spot_location.wkb == '101').first()) + centroid_geom = DBSpatialElement(session.scalar(session.query(Lake).first().lake_geom.centroid)) + eq_(session.scalar(WKBSpatialElement(session.scalar(centroid_geom.wkb)).wkt), 'POINT (-88.757840057564835 43.193797540630335)') + + @raises(AttributeError) + def test_svg(self): + eq_(session.scalar(self.r.road_geom.svg), 'M -88.674840936305699 -43.103503229299399 -88.6464173694267 -42.998168834394903 -88.607961955413998 -42.968073292993601 -88.516003356687904 -42.936305777070103 -88.4390925286624 -43.003184757961797') + ok_(self.r is session.query(Road).filter(Road.road_geom.svg == 'M -88.674840936305699 -43.103503229299399 -88.6464173694267 -42.998168834394903 -88.607961955413998 -42.968073292993601 -88.516003356687904 -42.936305777070103 -88.4390925286624 -43.003184757961797').first()) + eq_(session.scalar(func.svg('POINT(-88.9055734203822 43.0048567324841)')), 'cx="-88.905573420382197" cy="-43.0048567324841"') + ok_(session.query(Spot).filter(Spot.spot_location.svg == 'cx="-88.905573420382197" cy="-43.0048567324841"').first()) + + def test_gml(self): + eq_(session.scalar(self.r.road_geom.gml), '-88.6748409363057 43.1035032292994 -88.6464173694267 42.9981688343949 -88.607961955414 42.9680732929936 -88.5160033566879 42.9363057770701 -88.4390925286624 43.0031847579618') + + @raises(AttributeError) + def test_kml(self): + s = session.query(Spot).filter(Spot.spot_height==420.40).one() + eq_(session.scalar(s.spot_location.kml), '-88.5945861592357,42.9480095987261') + + @raises(AttributeError) + def test_geojson(self): + s = session.query(Spot).filter(Spot.spot_height==420.40).one() + session.scalar(s.spot_location.geojson) + + def test_dimension(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + l = session.query(Lake).filter(Lake.lake_name=='My Lake').one() + eq_(session.scalar(r.road_geom.dimension), 1) + eq_(session.scalar(l.lake_geom.dimension), 2) + ok_(session.query(Spot).filter(Spot.spot_location.dimension == 0).first() is not None) + eq_(session.scalar(functions.dimension('POINT(-88.5945861592357 42.9480095987261)')), 0) + + def test_srid(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + eq_(session.scalar(r.road_geom.srid), 4326) + ok_(session.query(Spot).filter(Spot.spot_location.srid == 4326).first() is not None) + eq_(session.scalar(functions.srid('POINT(-88.5945861592357 42.9480095987261)')), 4326) + + def test_is_empty(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + l = session.query(Lake).filter(Lake.lake_name=='My Lake').one() + assert not session.scalar(r.road_geom.is_empty) + assert not session.scalar(l.lake_geom.is_empty) + ok_(session.query(Spot).filter(Spot.spot_location.is_empty == False).first() is not None) + eq_(session.scalar(functions.is_empty('POINT(-88.5945861592357 42.9480095987261)')), False) + + def test_is_simple(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + l = session.query(Lake).filter(Lake.lake_name=='My Lake').one() + assert session.scalar(r.road_geom.is_simple) + assert session.scalar(l.lake_geom.is_simple) + ok_(session.query(Spot).filter(Spot.spot_location.is_simple == True).first() is not None) + eq_(session.scalar(functions.is_simple('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1)')), False) + + def test_is_closed(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + l = session.query(Lake).filter(Lake.lake_name=='My Lake').one() + assert not session.scalar(r.road_geom.is_closed) + assert session.scalar(l.lake_geom.is_closed) + ok_(session.query(Lake).filter(Lake.lake_geom.is_closed == True).first() is not None) + eq_(session.scalar(functions.is_closed('LINESTRING(0 0, 1 1)')), False) + + def test_is_ring(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + assert not session.scalar(r.road_geom.is_ring) + ok_(session.query(Road).filter(Road.road_geom.is_ring == True).first() is None) + eq_(session.scalar(functions.is_ring('LINESTRING(0 0, 0 1, 1 0, 1 1, 0 0)')), False) + + def test_num_points(self): + l = session.query(Lake).get(1) + r = session.query(Road).get(1) + s = session.query(Spot).get(1) + ok_(session.scalar(l.lake_geom.num_points)) + eq_(session.scalar(r.road_geom.num_points), 5) + ok_(session.scalar(s.spot_location.num_points)) + ok_(session.query(Road).filter(Road.road_geom.num_points == 5).first() is not None) + eq_(session.scalar(functions.num_points('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')), 4) + + def test_point_n(self): + l = session.query(Lake).get(1) + r = session.query(Road).get(1) + ok_(session.scalar(l.lake_geom.point_n(1))) + ok_(session.query(Road).filter(Road.road_geom.point_n(5) == WKTSpatialElement('POINT(-88.3655256496815 43.1402866687898)')).first() is not None) + eq_(session.scalar(functions.wkt(r.road_geom.point_n(5))), 'POINT (-88.3655256496815 43.1402866687898)') + eq_(session.scalar(functions.wkt(functions.point_n('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)', 1))) + , 'POINT (77.29 29.07)') + + def test_persistent(self): + eq_(session.scalar(self.r.road_geom.wkt), + 'LINESTRING (-88.6748409363057 43.1035032292994, -88.6464173694267 42.9981688343949, -88.607961955414 42.9680732929936, -88.5160033566879 42.9363057770701, -88.4390925286624 43.0031847579618)') + + def test_eq(self): + r1 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + r2 = session.query(Road).filter(Road.road_geom == 'LINESTRING(-88.5477708726115 42.6988853949045,-88.6096339299363 42.9697452675159,-88.6029460318471 43.0884554585987,-88.5912422101911 43.187101955414)').one() + r3 = session.query(Road).filter(Road.road_geom == r1.road_geom).one() + ok_(r1 is r2 is r3) + + def test_length(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + assert_almost_equal(session.scalar(r.road_geom.length), 0.496071476676014) + ok_(session.query(Road).filter(Road.road_geom.length > 0).first() is not None) + assert_almost_equal(session.scalar(functions.length('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')), 0.62916306324869398) + + def test_area(self): + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + assert_almost_equal(session.scalar(l.lake_geom.area), 0.10475991566721) + ok_(session.query(Lake).filter(Lake.lake_geom.area > 0).first() is not None) + assert_almost_equal(session.scalar(functions.area(WKTSpatialElement('POLYGON((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416))',2249))), + 928.625) + + def test_x(self): + s = session.query(Spot).filter(Spot.spot_height==420.40).one() + eq_(session.scalar(s.spot_location.x), -88.5945861592357) + s = session.query(Spot).filter(and_(Spot.spot_location.x < 0, Spot.spot_location.y > 42)).all() + ok_(s is not None) + eq_(session.scalar(functions.x('POINT(-88.3655256496815 43.1402866687898)')), -88.3655256496815) + + def test_y(self): + s = session.query(Spot).filter(Spot.spot_height==420.40).one() + eq_(session.scalar(s.spot_location.y), 42.9480095987261) + s = session.query(Spot).filter(and_(Spot.spot_location.y < 0, Spot.spot_location.y > 42)).all() + ok_(s is not None) + eq_(session.scalar(functions.y('POINT(-88.3655256496815 43.1402866687898)')), 43.1402866687898) + + def test_centroid(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + ok_(not session.scalar(functions.wkt(r.road_geom.centroid))) + eq_(session.scalar(functions.wkt(l.lake_geom.centroid)), 'POINT (-88.921453826951719 43.019149768468026)') + ok_(session.query(Spot).filter(Spot.spot_location.centroid == WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)')).first() is None) + ok_(session.scalar(functions.wkt(functions.centroid('MULTIPOINT ( -1 0, -1 2, -1 3, -1 4, -1 7, 0 1, 0 3, 1 1, 2 0, 6 0, 7 8, 9 8, 10 6 )'))) is None) + + def test_boundary(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + eq_(session.scalar(functions.wkt(r.road_geom.boundary)), 'MULTIPOINT ((-88.5912422100082 43.187101952731609), (-88.547770872712135 42.698885396122932))') + ok_(session.query(Road).filter(Road.road_geom.boundary == WKTSpatialElement('MULTIPOINT ((-88.5912422100082 43.187101952731609), (-88.547770872712135 42.698885396122932))')).first() is not None) + eq_(session.scalar(functions.wkt(functions.boundary('POLYGON((1 1,0 0, -1 1, 1 1))'))), + 'LINESTRING (0 0, 1 1, -1 1, 0 0)') + + def test_buffer(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + assert_almost_equal(session.scalar(functions.area(r.road_geom.buffer(10.0))), 323.99187776147323) + ok_(session.query(Spot).filter(functions.within('POINT(-88.5945861592357 42.9480095987261)', Spot.spot_location.buffer(10))).first() is not None) + assert_almost_equal(session.scalar(functions.area(functions.buffer('POINT(-88.5945861592357 42.9480095987261)', 10))), 314.12087152405275) + + def test_convex_hull(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + eq_(session.scalar(functions.wkt(r.road_geom.convex_hull)), + 'POLYGON ((-88.547770872712135 42.698885396122932, -88.5912422100082 43.187101952731609, -88.602946031838655 43.088455460965633, -88.609633930027485 42.969745270907879, -88.547770872712135 42.698885396122932))') + ok_(session.query(Spot).filter(Spot.spot_location.convex_hull == WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)')).first() is not None) + eq_(session.scalar(functions.wkt(functions.convex_hull('POINT(-88.5945861592357 42.9480095987261)'))), + 'POINT (-88.594586159235689 42.948009598726117)') + + def test_envelope(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + eq_(session.scalar(functions.wkt(r.road_geom.envelope)), + 'POLYGON ((-88.6096339299363 42.6988853949045, -88.5477708726115 42.6988853949045, -88.5477708726115 43.187101955414, -88.6096339299363 43.187101955414, -88.6096339299363 42.6988853949045))') + eq_(session.scalar(functions.geometry_type(self.r.road_geom.envelope)), 'Polygon') + ok_(session.query(Spot).filter(Spot.spot_location.envelope == WKTSpatialElement('POLYGON ((-88.9055744203822 43.0048557324841, -88.9055724203822 43.0048557324841, -88.9055724203822 43.0048577324841, -88.9055744203822 43.0048577324841, -88.9055744203822 43.0048557324841))')).first() is not None) + eq_(session.scalar(functions.wkt(functions.envelope('POINT(-88.5945861592357 42.9480095987261)'))), + 'POLYGON ((-88.5945871592357 42.948008598726105, -88.5945851592357 42.948008598726105, -88.5945851592357 42.9480105987261, -88.5945871592357 42.9480105987261, -88.5945871592357 42.948008598726105))') + + def test_start_point(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + eq_(session.scalar(functions.wkt(r.road_geom.start_point)), + 'POINT (-88.5477708726115 42.6988853949045)') + ok_(session.query(Road).filter(Road.road_geom.start_point == WKTSpatialElement('POINT(-88.9139332929936 42.5082802993631)')).first() is not None) + eq_(session.scalar(functions.wkt(functions.start_point('LINESTRING(0 1, 0 2)'))), + 'POINT (0 1)') + + def test_end_point(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + eq_(session.scalar(functions.wkt(r.road_geom.end_point)), + 'POINT (-88.5912422101911 43.187101955414)') + ok_(session.query(Road).filter(Road.road_geom.end_point == WKTSpatialElement('POINT(-88.3655256496815 43.1402866687898)')).first() is not None) + eq_(session.scalar(functions.wkt(functions.end_point('LINESTRING(0 1, 0 2)'))), + 'POINT (0 2)') + + @raises(NotImplementedError) + def test_transform(self): + spot = session.query(Spot).get(1) + # compare the coordinates using a tolerance, because they may vary on different systems + assert_almost_equal(session.scalar(functions.x(spot.spot_location.transform(2249))), -3890517.6109559298) + assert_almost_equal(session.scalar(functions.y(spot.spot_location.transform(2249))), 3627658.6746507999) + ok_(session.query(Spot).filter(Spot.spot_location.transform(2249) == WKTSpatialElement('POINT(-3890517.61095593 3627658.6746508)', 2249)).first() is not None) + eq_(session.scalar(functions.wkt(functions.transform(WKTSpatialElement('POLYGON((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416))', 2249), 4326))), + 'POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326 42.3903829478009,-71.1775844305465 42.3903826677917,-71.1775825927231 42.3902893647987,-71.1776848522251 42.3902896512902))') + + # Test Geometry Relationships + + def test_equals(self): + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Peter Rd').one() + r3 = session.query(Road).filter(Road.road_name=='Paul St').one() + equal_roads = session.query(Road).filter(Road.road_geom.equals(r1.road_geom)).all() + ok_(r1 in equal_roads) + ok_(r2 in equal_roads) + ok_(r3 not in equal_roads) + ok_(session.query(Spot).filter(Spot.spot_location.equals(WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)'))).first() is not None) + eq_(session.scalar(functions.equals('POINT(-88.5945861592357 42.9480095987261)', 'POINT(-88.5945861592357 42.9480095987261)')), True) + + def test_distance(self): + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() + r3 = session.query(Road).filter(Road.road_name=='Peter Rd').one() + assert_almost_equal(session.scalar(r1.road_geom.distance(r2.road_geom)), 0.336997238682841) + eq_(session.scalar(r1.road_geom.distance(r3.road_geom)), 0.0) + ok_(session.query(Spot).filter(Spot.spot_location.distance(WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)')) < 10).first() is not None) + assert_almost_equal(session.scalar(functions.distance('POINT(-88.5945861592357 42.9480095987261)', 'POINT(-88.5945861592357 42.9480095987261)')), 0) + + @raises(NotImplementedError) + def test_within_distance(self): + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() + roads_within_distance = session.query(Road).filter( + Road.road_geom.within_distance(r1.road_geom, 0.20)).all() + ok_(r2 in roads_within_distance) + ok_(r3 not in roads_within_distance) + eq_(session.scalar(functions.within_distance('POINT(-88.9139332929936 42.5082802993631)', 'POINT(-88.9139332929936 35.5082802993631)', 10)), True) + + def test_disjoint(self): + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() + disjoint_roads = session.query(Road).filter(Road.road_geom.disjoint(r1.road_geom)).all() + ok_(r2 not in disjoint_roads) + ok_(r3 in disjoint_roads) + eq_(session.scalar(functions.disjoint('POINT(0 0)', 'LINESTRING ( 2 0, 0 2 )')), True) + + + def test_intersects(self): + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() + intersecting_roads = session.query(Road).filter(Road.road_geom.intersects(r1.road_geom)).all() + ok_(r2 in intersecting_roads) + ok_(r3 not in intersecting_roads) + eq_(session.scalar(functions.intersects('POINT(0 0)', 'LINESTRING ( 2 0, 0 2 )')), False) + + def test_touches(self): + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() + l2 = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + r = session.query(Road).filter(Road.road_name=='Geordie Rd').one() + touching_lakes = session.query(Lake).filter(Lake.lake_geom.touches(r.road_geom)).all() + ok_(not session.scalar(l1.lake_geom.touches(r.road_geom))) + ok_(session.scalar(l2.lake_geom.touches(r.road_geom))) + ok_(l1 not in touching_lakes) + ok_(l2 in touching_lakes) + eq_(session.scalar(functions.touches('POINT(1 1)', 'LINESTRING (0 0, 1 1, 0 2)')), False) + + def test_crosses(self): + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Paul St').one() + l = session.query(Lake).filter(Lake.lake_name=='Lake White').one() + crossing_roads = session.query(Road).filter(Road.road_geom.crosses(l.lake_geom)).all() + ok_(not session.scalar(r1.road_geom.crosses(l.lake_geom))) + ok_(session.scalar(r2.road_geom.crosses(l.lake_geom))) + ok_(r1 not in crossing_roads) + ok_(r2 in crossing_roads) + eq_(session.scalar(functions.crosses('LINESTRING(0 1, 2 1)', 'LINESTRING (0 0, 1 2, 0 2)')), True) + + def test_within(self): + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() + p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() + spots_within = session.query(Spot).filter(Spot.spot_location.within(l.lake_geom)).all() + ok_(session.scalar(p1.spot_location.within(l.lake_geom))) + ok_(not session.scalar(p2.spot_location.within(l.lake_geom))) + ok_(p1 in spots_within) + ok_(p2 not in spots_within) + eq_(session.scalar(functions.within('LINESTRING(0 1, 2 1)', 'POLYGON((-1 -1, 3 -1, 3 2, -1 2, -1 -1))')), True) + buffer_geom = DBSpatialElement(session.scalar(l.lake_geom.buffer(10.0))) + spots_within = session.query(Spot).filter(l.lake_geom.within(buffer_geom)).all() + ok_(p1 in spots_within) + ok_(p2 in spots_within) + + def test_overlaps(self): + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() + l2 = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + l3 = session.query(Lake).filter(Lake.lake_name=='My Lake').one() + overlapping_lakes = session.query(Lake).filter(Lake.lake_geom.overlaps(l3.lake_geom)).all() + ok_(not session.scalar(l1.lake_geom.overlaps(l3.lake_geom))) + ok_(session.scalar(l2.lake_geom.overlaps(l3.lake_geom))) + ok_(l1 not in overlapping_lakes) + ok_(l2 in overlapping_lakes) + eq_(session.scalar(functions.overlaps('POLYGON((2 1, 4 1, 4 3, 2 3, 2 1))', 'POLYGON((-1 -1, 3 -1, 3 2, -1 2, -1 -1))')), True) + + def test_contains(self): + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() + p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() + p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() + containing_lakes = session.query(Lake).filter(Lake.lake_geom.gcontains(p1.spot_location)).all() + ok_(session.scalar(l.lake_geom.gcontains(p1.spot_location))) + ok_(not session.scalar(l.lake_geom.gcontains(p2.spot_location))) + ok_(l in containing_lakes) + ok_(l1 not in containing_lakes) + ok_(session.scalar(l.lake_geom.gcontains(WKTSpatialElement('POINT(-88.9055734203822 43.0048567324841)')))) + containing_lakes = session.query(Lake).filter(Lake.lake_geom.gcontains('POINT(-88.9055734203822 43.0048567324841)')).all() + ok_(l in containing_lakes) + ok_(l1 not in containing_lakes) + spots_within = session.query(Spot).filter(l.lake_geom.gcontains(Spot.spot_location)).all() + ok_(session.scalar(l.lake_geom.gcontains(p1.spot_location))) + ok_(not session.scalar(l.lake_geom.gcontains(p2.spot_location))) + ok_(p1 in spots_within) + ok_(p2 not in spots_within) + eq_(session.scalar(functions.gcontains('LINESTRING(0 1, 2 1)', 'POLYGON((-1 -1, 3 -1, 3 2, -1 2, -1 -1))')), False) + + @raises(NotImplementedError) + def test_covers(self): + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() + p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() + p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() + covering_lakes = session.query(Lake).filter(Lake.lake_geom.covers(p1.spot_location)).all() + ok_(session.scalar(l.lake_geom.covers(p1.spot_location))) + ok_(not session.scalar(l.lake_geom.covers(p2.spot_location))) + ok_(l in covering_lakes) + ok_(l1 not in covering_lakes) + eq_(session.scalar(functions.gcontains('LINESTRING(0 1, 2 1)', 'POLYGON((-1 -1, 3 -1, 3 2, -1 2, -1 -1))')), False) + + @raises(NotImplementedError) + def test_covered_by(self): + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() + p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() + covered_spots = session.query(Spot).filter(Spot.spot_location.covered_by(l.lake_geom)).all() + ok_(session.scalar(p1.spot_location.covered_by(l.lake_geom))) + ok_(not session.scalar(p2.spot_location.covered_by(l.lake_geom))) + ok_(p1 in covered_spots) + ok_(p2 not in covered_spots) + eq_(session.scalar(functions.covered_by('LINESTRING(0 1, 2 1)', 'POLYGON((-1 -1, 3 -1, 3 2, -1 2, -1 -1))')), True) + + @raises(NotImplementedError) + def test_intersection(self): + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + r = session.query(Road).filter(Road.road_name=='Geordie Rd').one() + s = session.query(Spot).filter(Spot.spot_height==454.66).one() + eq_(session.scalar(func.STAsText(l.lake_geom.intersection(s.spot_location))), 'GEOMETRYCOLLECTION EMPTY') + eq_(session.scalar(func.STAsText(session.scalar(l.lake_geom.intersection(r.road_geom)))), 'POINT(-89.0710987261147 43.243949044586)') + l = session.query(Lake).filter(Lake.lake_name=='Lake White').one() + r = session.query(Road).filter(Road.road_name=='Paul St').one() + eq_(session.scalar(func.STAsText(session.scalar(l.lake_geom.intersection(r.road_geom)))), 'LINESTRING(-88.1430673666454 42.6255500261493,-88.1140839697546 42.6230657349872)') + ok_(session.query(Lake).filter(Lake.lake_geom.intersection(r.road_geom) == WKTSpatialElement('LINESTRING(-88.1430673666454 42.6255500261493,-88.1140839697546 42.6230657349872)')).first() is not None) + + @raises(IntegrityError) + def test_constraint_nullable(self): + spot_null = Spot(spot_height=420.40, spot_location=MS_SPATIAL_NULL) + session.add(spot_null) + session.commit(); + ok_(True) + road_null = Road(road_name='Jeff Rd', road_geom=MS_SPATIAL_NULL) + session.add(road_null) + session.commit(); + + # Test SQL Server specific functions + + def test_text_zm(self): + engine.execute('INSERT INTO [spots] VALUES(%f, geometry::STGeomFromText(%s, %i))' % (130.23, "'POINT (-88.5945861592357 42.9480095987261 130.23 1)'", 4326)) + eq_(session.query(Spot.spot_location.text_zm.label('text_zm')).filter(Spot.spot_height==130.23).first().text_zm, 'POINT (-88.5945861592357 42.9480095987261 130.23 1)') + eq_(session.query(Spot.spot_location.text_zm.label('text_zm')).filter(Spot.spot_height==420.40).first().text_zm, 'POINT (-88.5945861592357 42.9480095987261)') + + + def test_buffer_with_tolerance(self): + r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + assert_almost_equal(session.scalar(functions.area(r.road_geom.buffer_with_tolerance(10.0, 20, 1))), 214.63894668789601) + assert_almost_equal(session.scalar(functions.area(r.road_geom.buffer_with_tolerance(10.0, 20, 0))), 214.63894668789601) + ok_(session.query(Spot).filter(functions.within('POINT(-88.5945861592357 42.9480095987261)', Spot.spot_location.buffer(10))).first() is not None) + assert_almost_equal(session.scalar(functions.area(ms_functions.buffer_with_tolerance('POINT(-88.5945861592357 42.9480095987261)', 10, 2, 0))), 306.21843345678644) + + def test_filter(self): + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() + intersecting_roads = session.query(Road).filter(Road.road_geom.filter(r1.road_geom)).all() + ok_(r2 in intersecting_roads) + ok_(r3 not in intersecting_roads) + eq_(session.scalar(ms_functions.filter('POINT(0 0)', 'LINESTRING ( 2 0, 0 2 )')), False) + + def test_instance_of(self): + ok_(session.query(Road).filter(Road.road_geom.instance_of('LINESTRING')).first() is not None) + ok_(session.query(Lake).filter(Lake.lake_geom.instance_of('POLYGON')).first() is not None) + ok_(session.query(Spot).filter(Spot.spot_location.instance_of('POINT')).first() is not None) + + def test_extended_coords(self): + engine.execute('INSERT INTO [spots] VALUES(%f, geometry::STGeomFromText(%s, %i))' % (130.23, "'POINT (-88.5945861592357 42.9480095987261 130.23 1)'", 4326)) + p = session.query(Spot.spot_location.z.label('z'), Spot.spot_location.m.label('m')).filter(Spot.spot_height==130.23).first() + eq_(p.z, 130.23) + eq_(p.m, 1) + p = session.query(Spot.spot_location.z.label('z'), Spot.spot_location.m.label('m')).filter(Spot.spot_height==420.40).first() + ok_(p.z is None) + ok_(p.m is None) + + def test_make_valid(self): + session.add(Shape(shape_name='Invalid Shape', shape_geom=WKTSpatialElement('LINESTRING(0 2, 1 1, 1 0, 1 1, 2 2)'))) + invalid_line = session.query(Shape).filter(Shape.shape_name=='Invalid Shape').first() + eq_(session.scalar(invalid_line.shape_geom.is_valid), 0) + invalid_line.shape_geom = DBSpatialElement(session.scalar(invalid_line.shape_geom.make_valid)) + valid_line = session.query(Shape).filter(Shape.shape_name=='Invalid Shape').first() + eq_(session.scalar(valid_line.shape_geom.is_valid), 1) + + + def test_reduce(self): + r = session.query(Road).first() + eq_(session.scalar(DBSpatialElement(session.scalar(r.road_geom.reduce(0.5))).wkt), + 'LINESTRING (-88.9139332929936 42.5082802993631, -88.3655256496815 43.1402866687898)') + eq_(session.scalar(DBSpatialElement(session.scalar(r.road_geom.reduce(0.05))).wkt), + 'LINESTRING (-88.9139332929936 42.5082802993631, -88.6113059044586 42.9680732929936, -88.3655256496815 43.1402866687898)') + eq_(session.scalar(DBSpatialElement(session.scalar(r.road_geom.reduce(0.0000000000001))).wkt), + session.scalar(r.road_geom.wkt)) + + + def test_to_string(self): + engine.execute('INSERT INTO [spots] VALUES(%f, geometry::STGeomFromText(%s, %i))' % (130.23, "'POINT (-88.5945861592357 42.9480095987261 130.23 1)'", 4326)) + session.add(Lake(lake_name='Vanished lake', lake_geom=MS_SPATIAL_NULL)) + eq_(session.query(Spot.spot_location.text_zm.label('to_string')).filter(Spot.spot_height==130.23).first().to_string, 'POINT (-88.5945861592357 42.9480095987261 130.23 1)') + eq_(session.query(Spot.spot_location.text_zm.label('to_string')).filter(Spot.spot_height==420.40).first().to_string, 'POINT (-88.5945861592357 42.9480095987261)') + ok_(session.query(Lake.lake_geom.to_string.label('to_string')).filter(Lake.lake_name=='Vanished lake').first().to_string is None) + + +if __name__ == '__main__': + import sys + import nose + + sys.argv.append(__name__) + result = nose.run() + sys.exit(int(not result)) diff --git a/geoalchemy/tests/test_mysql.py b/geoalchemy/tests/test_mysql.py index 84e88d5..4ae3ad2 100644 --- a/geoalchemy/tests/test_mysql.py +++ b/geoalchemy/tests/test_mysql.py @@ -66,16 +66,16 @@ def setUp(self): # Add objects. We can use strings... session.add_all([ - Road(road_name=u'Jeff Rd', road_geom='LINESTRING(-88.9139332929936 42.5082802993631,-88.8203027197452 42.5985669235669,-88.7383759681529 42.7239650127389,-88.6113059044586 42.9680732929936,-88.3655256496815 43.1402866687898)'), - Road(road_name=u'Peter Rd', road_geom='LINESTRING(-88.9139332929936 42.5082802993631,-88.8203027197452 42.5985669235669,-88.7383759681529 42.7239650127389,-88.6113059044586 42.9680732929936,-88.3655256496815 43.1402866687898)'), - Road(road_name=u'Geordie Rd', road_geom='LINESTRING(-89.2232485796178 42.6420382611465,-89.2449842484076 42.9179140573248,-89.2316084522293 43.106847178344,-89.0710987261147 43.243949044586,-89.092834566879 43.2957802993631,-89.092834566879 43.2957802993631,-89.0309715095541 43.3175159681529)'), - Road(road_name=u'Paul St', road_geom='LINESTRING(-88.2652071783439 42.5584395350319,-88.1598727834395 42.6269904904459,-88.1013536751592 42.621974566879,-88.0244428471338 42.6437102356688,-88.0110670509554 42.6771497261147)'), - Road(road_name=u'Graeme Ave', road_geom='LINESTRING(-88.5477708726115 42.6988853949045,-88.6096339299363 42.9697452675159,-88.6029460318471 43.0884554585987,-88.5912422101911 43.187101955414)'), - Road(road_name=u'Phil Tce', road_geom='LINESTRING(-88.9356689617834 42.9363057770701,-88.9824842484076 43.0366242484076,-88.9222931656051 43.1085191528662,-88.8487262866242 43.0449841210191)'), - Lake(lake_name=u'My Lake', lake_geom='POLYGON((-88.7968950764331 43.2305732929936,-88.7935511273885 43.1553344394904,-88.716640299363 43.1570064140127,-88.7250001719745 43.2339172420382,-88.7968950764331 43.2305732929936))'), - Lake(lake_name=u'Lake White', lake_geom='POLYGON((-88.1147292993631 42.7540605095542,-88.1548566878981 42.7824840764331,-88.1799363057325 42.7707802547771,-88.188296178344 42.7323248407643,-88.1832802547771 42.6955414012739,-88.1565286624204 42.6771496815287,-88.1448248407643 42.6336783439491,-88.131449044586 42.5718152866242,-88.1013535031847 42.565127388535,-88.1080414012739 42.5868630573248,-88.1164012738854 42.6119426751592,-88.1080414012739 42.6520700636943,-88.0980095541401 42.6838375796178,-88.0846337579618 42.7139331210191,-88.1013535031847 42.7423566878981,-88.1147292993631 42.7540605095542))'), - Lake(lake_name=u'Lake Blue', lake_geom='POLYGON((-89.0694267515924 43.1335987261147,-89.1078821656051 43.1135350318471,-89.1329617834395 43.0884554140127,-89.1312898089172 43.0466560509554,-89.112898089172 43.0132165605096,-89.0694267515924 42.9898089171975,-89.0343152866242 42.953025477707,-89.0209394904459 42.9179140127389,-89.0042197452229 42.8961783439491,-88.9774681528663 42.8644108280255,-88.9440286624204 42.8292993630573,-88.9072452229299 42.8142515923567,-88.8687898089172 42.815923566879,-88.8687898089172 42.815923566879,-88.8102707006369 42.8343152866242,-88.7734872611465 42.8710987261147,-88.7517515923567 42.9145700636943,-88.7433917197452 42.9730891719745,-88.7517515923567 43.0299363057325,-88.7734872611465 43.0867834394905,-88.7885352038217 43.158678388535,-88.8738057324841 43.1620222929936,-88.947372611465 43.1937898089172,-89.0042197452229 43.2138535031847,-89.0410031847134 43.2389331210191,-89.0710987261147 43.243949044586,-89.0660828025478 43.2238853503185,-89.0543789808917 43.203821656051,-89.0376592356688 43.175398089172,-89.0292993630573 43.1519904458599,-89.0376592356688 43.1369426751592,-89.0393312101911 43.1386146496815,-89.0393312101911 43.1386146496815,-89.0510350318471 43.1335987261147,-89.0694267515924 43.1335987261147))'), - Lake(lake_name=u'Lake Deep', lake_geom='POLYGON((-88.9122611464968 43.038296178344,-88.9222929936306 43.0399681528663,-88.9323248407643 43.0282643312102,-88.9206210191083 43.0182324840764,-88.9105891719745 43.0165605095542,-88.9005573248408 43.0232484076433,-88.9072452229299 43.0282643312102,-88.9122611464968 43.038296178344))'), + Road(road_name='Jeff Rd', road_geom='LINESTRING(-88.9139332929936 42.5082802993631,-88.8203027197452 42.5985669235669,-88.7383759681529 42.7239650127389,-88.6113059044586 42.9680732929936,-88.3655256496815 43.1402866687898)'), + Road(road_name='Peter Rd', road_geom='LINESTRING(-88.9139332929936 42.5082802993631,-88.8203027197452 42.5985669235669,-88.7383759681529 42.7239650127389,-88.6113059044586 42.9680732929936,-88.3655256496815 43.1402866687898)'), + Road(road_name='Geordie Rd', road_geom='LINESTRING(-89.2232485796178 42.6420382611465,-89.2449842484076 42.9179140573248,-89.2316084522293 43.106847178344,-89.0710987261147 43.243949044586,-89.092834566879 43.2957802993631,-89.092834566879 43.2957802993631,-89.0309715095541 43.3175159681529)'), + Road(road_name='Paul St', road_geom='LINESTRING(-88.2652071783439 42.5584395350319,-88.1598727834395 42.6269904904459,-88.1013536751592 42.621974566879,-88.0244428471338 42.6437102356688,-88.0110670509554 42.6771497261147)'), + Road(road_name='Graeme Ave', road_geom='LINESTRING(-88.5477708726115 42.6988853949045,-88.6096339299363 42.9697452675159,-88.6029460318471 43.0884554585987,-88.5912422101911 43.187101955414)'), + Road(road_name='Phil Tce', road_geom='LINESTRING(-88.9356689617834 42.9363057770701,-88.9824842484076 43.0366242484076,-88.9222931656051 43.1085191528662,-88.8487262866242 43.0449841210191)'), + Lake(lake_name='My Lake', lake_geom='POLYGON((-88.7968950764331 43.2305732929936,-88.7935511273885 43.1553344394904,-88.716640299363 43.1570064140127,-88.7250001719745 43.2339172420382,-88.7968950764331 43.2305732929936))'), + Lake(lake_name='Lake White', lake_geom='POLYGON((-88.1147292993631 42.7540605095542,-88.1548566878981 42.7824840764331,-88.1799363057325 42.7707802547771,-88.188296178344 42.7323248407643,-88.1832802547771 42.6955414012739,-88.1565286624204 42.6771496815287,-88.1448248407643 42.6336783439491,-88.131449044586 42.5718152866242,-88.1013535031847 42.565127388535,-88.1080414012739 42.5868630573248,-88.1164012738854 42.6119426751592,-88.1080414012739 42.6520700636943,-88.0980095541401 42.6838375796178,-88.0846337579618 42.7139331210191,-88.1013535031847 42.7423566878981,-88.1147292993631 42.7540605095542))'), + Lake(lake_name='Lake Blue', lake_geom='POLYGON((-89.0694267515924 43.1335987261147,-89.1078821656051 43.1135350318471,-89.1329617834395 43.0884554140127,-89.1312898089172 43.0466560509554,-89.112898089172 43.0132165605096,-89.0694267515924 42.9898089171975,-89.0343152866242 42.953025477707,-89.0209394904459 42.9179140127389,-89.0042197452229 42.8961783439491,-88.9774681528663 42.8644108280255,-88.9440286624204 42.8292993630573,-88.9072452229299 42.8142515923567,-88.8687898089172 42.815923566879,-88.8687898089172 42.815923566879,-88.8102707006369 42.8343152866242,-88.7734872611465 42.8710987261147,-88.7517515923567 42.9145700636943,-88.7433917197452 42.9730891719745,-88.7517515923567 43.0299363057325,-88.7734872611465 43.0867834394905,-88.7885352038217 43.158678388535,-88.8738057324841 43.1620222929936,-88.947372611465 43.1937898089172,-89.0042197452229 43.2138535031847,-89.0410031847134 43.2389331210191,-89.0710987261147 43.243949044586,-89.0660828025478 43.2238853503185,-89.0543789808917 43.203821656051,-89.0376592356688 43.175398089172,-89.0292993630573 43.1519904458599,-89.0376592356688 43.1369426751592,-89.0393312101911 43.1386146496815,-89.0393312101911 43.1386146496815,-89.0510350318471 43.1335987261147,-89.0694267515924 43.1335987261147))'), + Lake(lake_name='Lake Deep', lake_geom='POLYGON((-88.9122611464968 43.038296178344,-88.9222929936306 43.0399681528663,-88.9323248407643 43.0282643312102,-88.9206210191083 43.0182324840764,-88.9105891719745 43.0165605095542,-88.9005573248408 43.0232484076433,-88.9072452229299 43.0282643312102,-88.9122611464968 43.038296178344))'), Spot(spot_height=420.40, spot_location='POINT(-88.5945861592357 42.9480095987261)'), Spot(spot_height=102.34, spot_location='POINT(-88.9055734203822 43.0048567324841)'), Spot(spot_height=388.62, spot_location='POINT(-89.201512910828 43.1051752038217)'), @@ -83,7 +83,7 @@ def setUp(self): ]) # or use an explicit WKTSpatialElement (similar to saying func.GeomFromText()) - self.r = Road(road_name=u'Dave Cres', road_geom=WKTSpatialElement('LINESTRING(-88.6748409363057 43.1035032292994,-88.6464173694267 42.9981688343949,-88.607961955414 42.9680732929936,-88.5160033566879 42.9363057770701,-88.4390925286624 43.0031847579618)', 4326)) + self.r = Road(road_name='Dave Cres', road_geom=WKTSpatialElement('LINESTRING(-88.6748409363057 43.1035032292994,-88.6464173694267 42.9981688343949,-88.607961955414 42.9680732929936,-88.5160033566879 42.9363057770701,-88.4390925286624 43.0031847579618)', 4326)) session.add(self.r) session.commit() @@ -114,7 +114,7 @@ def test_coords(self): eq_(self.r.road_geom.coords(session), [[-88.674840936305699, 43.103503229299399], [-88.6464173694267, 42.998168834394903], [-88.607961955413998, 42.968073292993601], [-88.516003356687904, 42.936305777070103], [-88.4390925286624, 43.003184757961797]]) s = session.query(Spot).filter(Spot.spot_height==102.34).one() eq_(s.spot_location.coords(session), [-88.905573420382197, 43.0048567324841]) - l = session.query(Lake).filter(Lake.lake_name==u"Lake Deep").one() + l = session.query(Lake).filter(Lake.lake_name=="Lake Deep").one() eq_(l.lake_geom.coords(session), [[[-88.912261146496803, 43.038296178343998], [-88.922292993630606, 43.039968152866301], [-88.932324840764295, 43.028264331210202], [-88.920621019108296, 43.0182324840764], [-88.910589171974493, 43.016560509554203], [-88.900557324840804, 43.023248407643301], [-88.907245222929902, 43.028264331210202], [-88.912261146496803, 43.038296178343998]]]) def test_persistent(self): @@ -176,7 +176,7 @@ def test_x(self): s = session.query(Spot).get(1) ok_( not session.scalar(l.lake_geom.x)) ok_( not session.scalar(r.road_geom.x)) - print session.scalar(s.spot_location.x) + print(session.scalar(s.spot_location.x)) eq_(math.ceil(session.scalar(s.spot_location.x)), -88.0) s = session.query(Spot).filter(and_(Spot.spot_location.x < 0, Spot.spot_location.y > 42)).all() ok_(s is not None) @@ -268,9 +268,9 @@ def test_area(self): # Test Geometry Relations for Spatial Elements def test_equals(self): - r1 = session.query(Road).filter(Road.road_name==u'Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name==u'Peter Rd').one() - r3 = session.query(Road).filter(Road.road_name==u'Paul St').one() + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Peter Rd').one() + r3 = session.query(Road).filter(Road.road_name=='Paul St').one() equal_roads = session.query(Road).filter(Road.road_geom.equals(r1.road_geom)).all() ok_(r1 in equal_roads) ok_(r2 in equal_roads) @@ -278,40 +278,40 @@ def test_equals(self): @raises(NotImplementedError) def test_distance(self): - r1 = session.query(Road).filter(Road.road_name==u'Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name==u'Geordie Rd').one() + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() value1 = session.scalar(r1.road_geom.distance(r2.road_geom)) value2 = session.scalar(r2.road_geom.distance(r1.road_geom)) eq_(value1, value2) def test_disjoint(self): - r1 = session.query(Road).filter(Road.road_name==u'Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name==u'Graeme Ave').one() - r3 = session.query(Road).filter(Road.road_name==u'Geordie Rd').one() + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() disjoint_roads = session.query(Road).filter(Road.road_geom.disjoint(r1.road_geom)).all() ok_(r2 not in disjoint_roads) ok_(r3 in disjoint_roads) def test_intersects(self): - r1 = session.query(Road).filter(Road.road_name==u'Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name==u'Graeme Ave').one() - r3 = session.query(Road).filter(Road.road_name==u'Geordie Rd').one() + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() intersecting_roads = session.query(Road).filter(Road.road_geom.intersects(r1.road_geom)).all() ok_(r2 in intersecting_roads) ok_(r3 not in intersecting_roads) @raises(NotImplementedError) def test_touches(self): - r = session.query(Road).filter(Road.road_name==u'Geordie Rd').one() + r = session.query(Road).filter(Road.road_name=='Geordie Rd').one() session.query(Lake).filter(Lake.lake_geom.touches(r.road_geom)).all() @raises(NotImplementedError) def test_crosses(self): - l = session.query(Lake).filter(Lake.lake_name==u'Lake White').one() + l = session.query(Lake).filter(Lake.lake_name=='Lake White').one() session.query(Road).filter(Road.road_geom.crosses(l.lake_geom)).all() def test_within(self): - l = session.query(Lake).filter(Lake.lake_name==u'Lake Blue').one() + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() spots_within = session.query(Spot).filter(Spot.spot_location.within(l.lake_geom)).all() @@ -325,9 +325,9 @@ def test_within(self): ok_(p2 in spots_within) def test_overlaps(self): - l1 = session.query(Lake).filter(Lake.lake_name==u'Lake White').one() - l2 = session.query(Lake).filter(Lake.lake_name==u'Lake Blue').one() - l3 = session.query(Lake).filter(Lake.lake_name==u'My Lake').one() + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() + l2 = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + l3 = session.query(Lake).filter(Lake.lake_name=='My Lake').one() overlapping_lakes = session.query(Lake).filter(Lake.lake_geom.overlaps(l3.lake_geom)).all() ok_(not session.scalar(l1.lake_geom.overlaps(l3.lake_geom))) ok_(session.scalar(l2.lake_geom.overlaps(l3.lake_geom))) @@ -335,8 +335,8 @@ def test_overlaps(self): ok_(l2 in overlapping_lakes) def test_contains(self): - l = session.query(Lake).filter(Lake.lake_name==u'Lake Blue').one() - l1 = session.query(Lake).filter(Lake.lake_name==u'Lake White').one() + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() containing_lakes = session.query(Lake).filter(Lake.lake_geom.gcontains(p1.spot_location)).all() @@ -357,9 +357,9 @@ def test_contains(self): # Test Geometry Relations for Minimum Bounding Rectangles (MBRs) def test_mbr_equal(self): - r1 = session.query(Road).filter(Road.road_name==u'Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name==u'Peter Rd').one() - r3 = session.query(Road).filter(Road.road_name==u'Paul St').one() + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Peter Rd').one() + r3 = session.query(Road).filter(Road.road_name=='Paul St').one() equal_roads = session.query(Road).filter(Road.road_geom.mbr_equal(r1.road_geom)).all() ok_(r1 in equal_roads) ok_(r2 in equal_roads) @@ -369,33 +369,33 @@ def test_mbr_equal(self): def test_mbr_disjoint(self): - r1 = session.query(Road).filter(Road.road_name==u'Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name==u'Graeme Ave').one() - r3 = session.query(Road).filter(Road.road_name==u'Geordie Rd').one() + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() disjoint_roads = session.query(Road).filter(Road.road_geom.mbr_disjoint(r1.road_geom)).all() ok_(r2 not in disjoint_roads) ok_(r3 in disjoint_roads) def test_mbr_intersects(self): - r1 = session.query(Road).filter(Road.road_name==u'Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name==u'Graeme Ave').one() - r3 = session.query(Road).filter(Road.road_name==u'Geordie Rd').one() + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() intersecting_roads = session.query(Road).filter(Road.road_geom.mbr_intersects(r1.road_geom)).all() ok_(r2 in intersecting_roads) ok_(r3 not in intersecting_roads) def test_mbr_touches(self): - l1 = session.query(Lake).filter(Lake.lake_name==u'Lake White').one() - l2 = session.query(Lake).filter(Lake.lake_name==u'Lake Blue').one() - r = session.query(Road).filter(Road.road_name==u'Geordie Rd').one() + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() + l2 = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + r = session.query(Road).filter(Road.road_name=='Geordie Rd').one() touching_lakes = session.query(Lake).filter(Lake.lake_geom.mbr_touches(r.road_geom)).all() ok_(l1 not in touching_lakes) ok_(l2 not in touching_lakes) - eq_(session.scalar(l1.lake_geom.mbr_touches(r.road_geom)), 0L) - eq_(session.scalar(l2.lake_geom.mbr_touches(r.road_geom)), 0L) + eq_(session.scalar(l1.lake_geom.mbr_touches(r.road_geom)), 0) + eq_(session.scalar(l2.lake_geom.mbr_touches(r.road_geom)), 0) def test_mbr_within(self): - l = session.query(Lake).filter(Lake.lake_name==u'Lake Blue').one() + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() spots_within = session.query(Spot).filter(Spot.spot_location.mbr_within(l.lake_geom)).all() @@ -405,9 +405,9 @@ def test_mbr_within(self): ok_(p2 not in spots_within) def test_mbr_overlaps(self): - l1 = session.query(Lake).filter(Lake.lake_name==u'Lake White').one() - l2 = session.query(Lake).filter(Lake.lake_name==u'Lake Blue').one() - l3 = session.query(Lake).filter(Lake.lake_name==u'My Lake').one() + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() + l2 = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + l3 = session.query(Lake).filter(Lake.lake_name=='My Lake').one() overlapping_lakes = session.query(Lake).filter(Lake.lake_geom.mbr_overlaps(l3.lake_geom)).all() ok_(not session.scalar(l1.lake_geom.mbr_overlaps(l3.lake_geom))) ok_(session.scalar(l2.lake_geom.mbr_overlaps(l3.lake_geom))) @@ -415,8 +415,8 @@ def test_mbr_overlaps(self): ok_(l2 in overlapping_lakes) def test_mbr_contains(self): - l = session.query(Lake).filter(Lake.lake_name==u'Lake Blue').one() - l1 = session.query(Lake).filter(Lake.lake_name==u'Lake White').one() + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() containing_lakes = session.query(Lake).filter(Lake.lake_geom.mbr_contains(p1.spot_location)).all() @@ -440,7 +440,7 @@ def test_within_distance(self): @raises(OperationalError) def test_constraint_nullable(self): - road_null = Road(road_name=u'Jeff Rd', road_geom=None) + road_null = Road(road_name='Jeff Rd', road_geom=None) session.add(road_null) session.commit(); diff --git a/geoalchemy/tests/test_oracle.py b/geoalchemy/tests/test_oracle.py index 834a9f4..3c4270d 100644 --- a/geoalchemy/tests/test_oracle.py +++ b/geoalchemy/tests/test_oracle.py @@ -165,11 +165,11 @@ def test_geometry_type(self): l = session.query(Lake).get(1) s = session.query(Spot).get(1) - eq_(session.scalar(r.road_geom.geometry_type), u'ST_LINESTRING') - eq_(session.scalar(l.lake_geom.geometry_type), u'ST_POLYGON') - eq_(session.scalar(s.spot_location.geometry_type), u'ST_POINT') - eq_(session.scalar(functions.geometry_type(r.road_geom)), u'ST_LINESTRING') - ok_(session.query(Road).filter(Road.road_geom.geometry_type == u'ST_LINESTRING').first()) + eq_(session.scalar(r.road_geom.geometry_type), 'ST_LINESTRING') + eq_(session.scalar(l.lake_geom.geometry_type), 'ST_POLYGON') + eq_(session.scalar(s.spot_location.geometry_type), 'ST_POINT') + eq_(session.scalar(functions.geometry_type(r.road_geom)), 'ST_LINESTRING') + ok_(session.query(Road).filter(Road.road_geom.geometry_type == 'ST_LINESTRING').first()) def test_gtype(self): r = session.query(Road).get(1) @@ -213,7 +213,7 @@ def test_coords(self): def test_wkb(self): eq_(session.scalar(functions.wkt(func.SDO_GEOMETRY(self.r.road_geom.wkb, 4326))), - u'LINESTRING (-88.6748409363057 43.1035032292994, -88.6464173694267 42.9981688343949, -88.607961955414 42.9680732929936, -88.5160033566879 42.9363057770701, -88.4390925286624 43.0031847579618)') + 'LINESTRING (-88.6748409363057 43.1035032292994, -88.6464173694267 42.9981688343949, -88.607961955414 42.9680732929936, -88.5160033566879 42.9363057770701, -88.4390925286624 43.0031847579618)') eq_(session.scalar(self.r.road_geom.wkb), self.r.road_geom.geom_wkb) ok_(not session.query(Spot).filter(func.DBMS_LOB.Compare(Spot.spot_location.wkb, func.to_blob('101')) == 0).first()) # centroid_geom = DBSpatialElement(session.scalar(self.r.road_geom.centroid)) @@ -221,14 +221,14 @@ def test_wkb(self): def test_gml(self): - eq_(session.scalar(self.r.road_geom.gml), u'-88.6748409363057,43.1035032292994 -88.6464173694267,42.9981688343949 -88.607961955414,42.9680732929936 -88.5160033566879,42.9363057770701 -88.4390925286624,43.0031847579618 ') + eq_(session.scalar(self.r.road_geom.gml), '-88.6748409363057,43.1035032292994 -88.6464173694267,42.9981688343949 -88.607961955414,42.9680732929936 -88.5160033566879,42.9363057770701 -88.4390925286624,43.0031847579618 ') def test_gml311(self): - eq_(session.scalar(self.r.road_geom.gml311), u'-88.6748409363057 43.1035032292994 -88.6464173694267 42.9981688343949 -88.607961955414 42.9680732929936 -88.5160033566879 42.9363057770701 -88.4390925286624 43.0031847579618 ') + eq_(session.scalar(self.r.road_geom.gml311), '-88.6748409363057 43.1035032292994 -88.6464173694267 42.9981688343949 -88.607961955414 42.9680732929936 -88.5160033566879 42.9363057770701 -88.4390925286624 43.0031847579618 ') def test_kml(self): s = session.query(Spot).get(1) - eq_(session.scalar(s.spot_location.kml), u'00relativeToGround-88.5945861592357,42.9480095987261 ') + eq_(session.scalar(s.spot_location.kml), '00relativeToGround-88.5945861592357,42.9480095987261 ') def test_dims(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() @@ -297,17 +297,17 @@ def test_num_points(self): def test_point_n(self): r = session.query(Road).get(1) - ok_(session.query(Road).filter(and_(Road.road_geom.point_n(5) <> None, + ok_(session.query(Road).filter(and_(Road.road_geom.point_n(5) != None, functions.wkt(Road.road_geom.point_n(5)) == 'POINT (-88.3655256496815 43.1402866687898)')).first() is not None) - eq_(session.scalar(r.road_geom.point_n(5).wkt), u'POINT (-88.3655256496815 43.1402866687898)') + eq_(session.scalar(r.road_geom.point_n(5).wkt), 'POINT (-88.3655256496815 43.1402866687898)') eq_(session.scalar(functions.wkt(functions.point_n( WKTSpatialElement('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)', geometry_type=LineString.name), 1))), - u'POINT (77.29 29.07)') + 'POINT (77.29 29.07)') def test_persistent(self): eq_(session.scalar(functions.wkt(func.SDO_GEOMETRY(self.r.road_geom.wkb, 4326))), - u'LINESTRING (-88.6748409363057 43.1035032292994, -88.6464173694267 42.9981688343949, -88.607961955414 42.9680732929936, -88.5160033566879 42.9363057770701, -88.4390925286624 43.0031847579618)') + 'LINESTRING (-88.6748409363057 43.1035032292994, -88.6464173694267 42.9981688343949, -88.607961955414 42.9680732929936, -88.5160033566879 42.9363057770701, -88.4390925286624 43.0031847579618)') geom = WKTSpatialElement('POINT(30250865.9714116 -610981.481754275)', 2249) spot = Spot(spot_height=102.34, spot_location=geom) @@ -365,17 +365,17 @@ def test_centroid(self): l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() # Oracle does not support centroid for LineString eq_(session.scalar(functions.wkt(r.road_geom.centroid)), None) - eq_(session.scalar(functions.wkt(l.lake_geom.centroid)), u'POINT (-88.9213649409212 43.0190392609092)') + eq_(session.scalar(functions.wkt(l.lake_geom.centroid)), 'POINT (-88.9213649409212 43.0190392609092)') ok_(session.query(Spot).filter(functions.wkt(Spot.spot_location.centroid) == 'POINT (-88.5945861592357 42.9480095987261)').first() is not None) eq_(session.scalar(functions.wkt(functions.centroid('MULTIPOINT((-1 0), (-1 2), (-1 3), (-1 4), (-1 7), (0 1), (0 3), (1 1), (2 0), (6 0), (7 8), (9 8), (10 6) )', diminfo_))), - u'POINT (2.30460703912783 3.31788085910597)') + 'POINT (2.30460703912783 3.31788085910597)') def test_boundary(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - eq_(session.scalar(r.road_geom.boundary.wkt), u'MULTIPOINT ((-88.5477708726115 42.6988853949045), (-88.5912422101911 43.187101955414))') + eq_(session.scalar(r.road_geom.boundary.wkt), 'MULTIPOINT ((-88.5477708726115 42.6988853949045), (-88.5912422101911 43.187101955414))') ok_(session.query(Road).filter(Road.road_geom.boundary.wkt == 'MULTIPOINT ((-88.9139332929936 42.5082802993631), (-88.3655256496815 43.1402866687898))').first() is not None) eq_(session.scalar(functions.wkt(functions.boundary(WKTSpatialElement('POLYGON((1 1,0 0, -1 1, 1 1))', geometry_type=Polygon.name)))), - u'LINESTRING (1.0 1.0, 0.0 0.0, -1.0 1.0, 1.0 1.0)') + 'LINESTRING (1.0 1.0, 0.0 0.0, -1.0 1.0, 1.0 1.0)') def test_buffer(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() @@ -391,39 +391,39 @@ def test_buffer(self): def test_convex_hull(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() eq_(session.scalar(functions.wkt(r.road_geom.convex_hull)), - u'POLYGON ((-88.5477708728477 42.6988853969538, -88.5912422100661 43.1871019533972, -88.6029460317718 43.0884554581896, -88.6096339299412 42.9697452675198, -88.5477708728477 42.6988853969538))') + 'POLYGON ((-88.5477708728477 42.6988853969538, -88.5912422100661 43.1871019533972, -88.6029460317718 43.0884554581896, -88.6096339299412 42.9697452675198, -88.5477708728477 42.6988853969538))') # Oracle does not support ConvexHull for points ok_(session.query(Spot).filter(functions.equals(Spot.spot_location.convex_hull, WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)'))).first() is None) eq_(session.scalar(functions.wkt(functions.convex_hull('LINESTRING(0 0, 1 1, 1 0)', diminfo_))), - u'POLYGON ((0.999999915732742 8.48487373222706E-8, 0.999999915755202 0.999999915201249, 8.4273559349594E-8 8.48422467917753E-8, 0.999999915732742 8.48487373222706E-8))') + 'POLYGON ((0.999999915732742 8.48487373222706E-8, 0.999999915755202 0.999999915201249, 8.4273559349594E-8 8.48422467917753E-8, 0.999999915732742 8.48487373222706E-8))') def test_envelope(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() eq_(session.scalar(functions.wkt(r.road_geom.envelope)), - u'POLYGON ((-88.6096339299363 42.6988853949045, -88.5477708726115 42.6988853949045, -88.5477708726115 43.187101955414, -88.6096339299363 43.187101955414, -88.6096339299363 42.6988853949045))') - eq_(session.scalar(functions.geometry_type(self.r.road_geom.envelope)), u'ST_POLYGON') + 'POLYGON ((-88.6096339299363 42.6988853949045, -88.5477708726115 42.6988853949045, -88.5477708726115 43.187101955414, -88.6096339299363 43.187101955414, -88.6096339299363 42.6988853949045))') + eq_(session.scalar(functions.geometry_type(self.r.road_geom.envelope)), 'ST_POLYGON') ok_(session.query(Spot).filter(functions.wkt(Spot.spot_location.envelope) == 'POINT (-88.5945861592357 42.9480095987261)').first() is not None) eq_(session.scalar(functions.wkt(functions.envelope(WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)', geometry_type=Point.name)))), - u'POINT (-88.5945861592357 42.9480095987261)') + 'POINT (-88.5945861592357 42.9480095987261)') def test_start_point(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() eq_(session.scalar(functions.wkt(r.road_geom.start_point)), - u'POINT (-88.5477708726115 42.6988853949045)') + 'POINT (-88.5477708726115 42.6988853949045)') ok_(session.query(Road).filter(functions.wkt(Road.road_geom.start_point) == 'POINT (-88.9139332929936 42.5082802993631)').first() is not None) eq_(session.scalar(functions.wkt(functions.start_point(WKTSpatialElement('LINESTRING(0 1, 0 2)', geometry_type=LineString.name)))), - u'POINT (0.0 1.0)') + 'POINT (0.0 1.0)') def test_end_point(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() eq_(session.scalar(functions.wkt(r.road_geom.end_point)), - u'POINT (-88.5912422101911 43.187101955414)') + 'POINT (-88.5912422101911 43.187101955414)') ok_(session.query(Road).filter(functions.wkt(Road.road_geom.end_point) == 'POINT (-88.3655256496815 43.1402866687898)').first() is not None) eq_(session.scalar(functions.wkt(functions.end_point(WKTSpatialElement('LINESTRING(0 1, 0 2)', geometry_type=LineString.name)))), - u'POINT (0.0 2.0)') + 'POINT (0.0 2.0)') def test_transform(self): spot = session.query(Spot).get(1) @@ -432,7 +432,7 @@ def test_transform(self): assert_almost_equal(float(session.scalar(functions.y(func.ST_POINT(spot.spot_location.transform(2249))))), 3627658.6749871401) ok_(session.query(Spot).filter(functions.wkt(Spot.spot_location.transform(2249)) == 'POINT (-3890517.61088792 3627658.67498714)').first() is not None) eq_(session.scalar(functions.wkt(functions.transform(WKTSpatialElement('POLYGON((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416))', 2249), 4326))), - u'POLYGON ((-71.1776848522252 42.3902896503503, -71.1776843766327 42.390382946861, -71.1775844305466 42.3903826668518, -71.1775825927231 42.3902893638588, -71.1776848522252 42.3902896503503))') + 'POLYGON ((-71.1776848522252 42.3902896503503, -71.1776843766327 42.390382946861, -71.1775844305466 42.3903826668518, -71.1775825927231 42.3902893638588, -71.1776848522252 42.3902896503503))') # Test Geometry Relationships @@ -654,7 +654,7 @@ def test_intersection(self): eq_(session.scalar(functions.wkt(l.lake_geom.intersection(s.spot_location, tolerance, auto_diminfo=False))), None) l = session.query(Lake).filter(Lake.lake_name=='Lake White').one() r = session.query(Road).filter(Road.road_name=='Paul St').one() - eq_(session.scalar(functions.wkt(l.lake_geom.intersection(r.road_geom))), u'LINESTRING (-88.1430664921296 42.6255530821991, -88.114084510211 42.6230683849207)') + eq_(session.scalar(functions.wkt(l.lake_geom.intersection(r.road_geom))), 'LINESTRING (-88.1430664921296 42.6255530821991, -88.114084510211 42.6230683849207)') ok_(session.query(Lake).filter(functions.equals(Lake.lake_geom.intersection(r.road_geom), WKTSpatialElement('LINESTRING(-88.1430664921296 42.6255530821991, -88.114084510211 42.6230683849207)'))).first() is not None) def test_sdo_geom_sdo_area(self): @@ -669,12 +669,12 @@ def test_sdo_geom_sdo_centroid(self): def test_sdo_geom_sdo_concavehull(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() eq_(session.scalar(functions.wkt(r.road_geom.sdo_geom_sdo_concavehull(tolerance))), - u'POLYGON ((-88.5477708728477 42.6988853969538, -88.5912422100661 43.1871019533972, -88.6029460317718 43.0884554581896, -88.6096339299412 42.9697452675198, -88.5477708728477 42.6988853969538))') + 'POLYGON ((-88.5477708728477 42.6988853969538, -88.5912422100661 43.1871019533972, -88.6029460317718 43.0884554581896, -88.6096339299412 42.9697452675198, -88.5477708728477 42.6988853969538))') def test_sdo_geom_sdo_concavehull_boundary(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() eq_(session.scalar(functions.wkt(r.road_geom.sdo_geom_sdo_concavehull_boundary(tolerance))), - u'POLYGON ((-88.5477708728477 42.6988853969538, -88.5912422100661 43.1871019533972, -88.6029460317718 43.0884554581896, -88.6096339299412 42.9697452675198, -88.5477708728477 42.6988853969538))') + 'POLYGON ((-88.5477708728477 42.6988853969538, -88.5912422100661 43.1871019533972, -88.6029460317718 43.0884554581896, -88.6096339299412 42.9697452675198, -88.5477708728477 42.6988853969538))') def test_sdo_geom_sdo_convexhull(self): ok_(self.test_convex_hull, 'same as functions.convex_hull') @@ -684,7 +684,7 @@ def test_sdo_geom_sdo_difference(self): 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', 'POLYGON((-10 1, 5 1, 5 8, -10 8, -10 1))', tolerance))), - u'POLYGON ((5.0 1.0, 5.0 8.0, 0.0 8.06054845190832, 0.0 1.00766739404158, 5.0 1.0))') + 'POLYGON ((5.0 1.0, 5.0 8.0, 0.0 8.06054845190832, 0.0 1.00766739404158, 5.0 1.0))') def test_sdo_geom_sdo_distance(self): @@ -699,25 +699,25 @@ def test_sdo_geom_sdo_length(self): def test_sdo_geom_sdo_mbr(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() eq_(session.scalar(functions.wkt(r.road_geom.sdo_geom_sdo_mbr)), - u'POLYGON ((-88.6096339299363 42.6988853949045, -88.5477708726115 42.6988853949045, -88.5477708726115 43.187101955414, -88.6096339299363 43.187101955414, -88.6096339299363 42.6988853949045))') + 'POLYGON ((-88.6096339299363 42.6988853949045, -88.5477708726115 42.6988853949045, -88.5477708726115 43.187101955414, -88.6096339299363 43.187101955414, -88.6096339299363 42.6988853949045))') def test_sdo_geom_sdo_pointonsurface(self): l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() - eq_(session.scalar(functions.wkt(l.lake_geom.sdo_geom_sdo_pointonsurface)), u'POINT (-89.0694267515924 43.1335987261147)') + eq_(session.scalar(functions.wkt(l.lake_geom.sdo_geom_sdo_pointonsurface)), 'POINT (-89.0694267515924 43.1335987261147)') def test_sdo_geom_sdo_union(self): eq_(session.scalar(functions.wkt(oracle_functions.sdo_geom_sdo_union( 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', 'POLYGON((-10 1, 5 1, 5 8, -10 8, -10 1))', tolerance))), - u'POLYGON ((0.0 8.06054845190832, -10.0 8.0, -10.0 1.0, 0.0 1.00766739404158, 0.0 0.0, 10.0 0.0, 10.0 10.0, 0.0 10.0, 0.0 8.06054845190832))') + 'POLYGON ((0.0 8.06054845190832, -10.0 8.0, -10.0 1.0, 0.0 1.00766739404158, 0.0 0.0, 10.0 0.0, 10.0 10.0, 0.0 10.0, 0.0 8.06054845190832))') def test_sdo_geom_sdo_xor(self): eq_(session.scalar(functions.wkt(oracle_functions.sdo_geom_sdo_xor( 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', 'POLYGON((-10 1, 5 1, 5 8, -10 8, -10 1))', tolerance))), - u'MULTIPOLYGON (((-10.0 8.0, -10.0 1.0, 0.0 1.00766739404158, 0.0 8.06054845190832, -10.0 8.0)), ((10.0 0.0, 10.0 10.0, 0.0 10.0, 0.0 8.06054845190832, 5.0 8.0, 5.0 1.0, 0.0 1.00766739404158, 0.0 0.0, 10.0 0.0)))') + 'MULTIPOLYGON (((-10.0 8.0, -10.0 1.0, 0.0 1.00766739404158, 0.0 8.06054845190832, -10.0 8.0)), ((10.0 0.0, 10.0 10.0, 0.0 10.0, 0.0 8.06054845190832, 5.0 8.0, 5.0 1.0, 0.0 1.00766739404158, 0.0 0.0, 10.0 0.0)))') def test_sdo_geom_sdo_within_distance(self): ok_(self.test_within_distance, 'same as functions.within_distance') diff --git a/geoalchemy/tests/test_postgis.py b/geoalchemy/tests/test_postgis.py index 9100f80..98ae023 100644 --- a/geoalchemy/tests/test_postgis.py +++ b/geoalchemy/tests/test_postgis.py @@ -139,9 +139,9 @@ def test_wkt(self): ok_(session.query(Spot).get(1) is session.query(Spot).filter(Spot.spot_location == 'POINT(-88.5945861592357 42.9480095987261)').first()) centroid_geom = DBSpatialElement(session.scalar(self.r.road_geom.centroid)) - eq_(session.scalar(centroid_geom.wkt), u'POINT(-88.5769371859941 42.9915634871979)') - eq_(session.scalar(WKTSpatialElement('POINT(-88.5769371859941 42.9915634871979)').wkt), u'POINT(-88.5769371859941 42.9915634871979)') - eq_(session.query(Spot.spot_location.wkt).filter(Spot.spot_id == 1).first(), (u'POINT(-88.5945861592357 42.9480095987261)',)) + eq_(session.scalar(centroid_geom.wkt), 'POINT(-88.5769371859941 42.9915634871979)') + eq_(session.scalar(WKTSpatialElement('POINT(-88.5769371859941 42.9915634871979)').wkt), 'POINT(-88.5769371859941 42.9915634871979)') + eq_(session.query(Spot.spot_location.wkt).filter(Spot.spot_id == 1).first(), ('POINT(-88.5945861592357 42.9480095987261)',)) def test_coords(self): eq_(self.r.road_geom.coords(session), [[-88.6748409363057,43.1035032292994],[-88.6464173694267,42.9981688343949],[-88.607961955414,42.9680732929936],[-88.5160033566879,42.9363057770701],[-88.4390925286624,43.0031847579618]]) @@ -152,16 +152,16 @@ def test_coords(self): def test_wkb(self): eq_(session.scalar(functions.wkt(func.ST_GeomFromWKB(self.r.road_geom.wkb, 4326))), - u'LINESTRING(-88.6748409363057 43.1035032292994,-88.6464173694267 42.9981688343949,-88.607961955414 42.9680732929936,-88.5160033566879 42.9363057770701,-88.4390925286624 43.0031847579618)') + 'LINESTRING(-88.6748409363057 43.1035032292994,-88.6464173694267 42.9981688343949,-88.607961955414 42.9680732929936,-88.5160033566879 42.9363057770701,-88.4390925286624 43.0031847579618)') eq_(session.scalar(self.r.road_geom.wkb), self.r.road_geom.geom_wkb) ok_(not session.query(Spot).filter(Spot.spot_location.wkb == '101').first()) centroid_geom = DBSpatialElement(session.scalar(self.r.road_geom.centroid)) - eq_(session.scalar(functions.wkt(func.ST_GeomFromWKB(centroid_geom.wkb, 4326))), u'POINT(-88.5769371859941 42.9915634871979)') + eq_(session.scalar(functions.wkt(func.ST_GeomFromWKB(centroid_geom.wkb, 4326))), 'POINT(-88.5769371859941 42.9915634871979)') def test_svg(self): - eq_(session.scalar(self.r.road_geom.svg), u'M -88.674840936305699 -43.103503229299399 L -88.6464173694267 -42.998168834394903 -88.607961955413998 -42.968073292993601 -88.516003356687904 -42.936305777070103 -88.4390925286624 -43.003184757961797') - ok_(self.r is session.query(Road).filter(Road.road_geom.svg == u'M -88.674840936305699 -43.103503229299399 L -88.6464173694267 -42.998168834394903 -88.607961955413998 -42.968073292993601 -88.516003356687904 -42.936305777070103 -88.4390925286624 -43.003184757961797').first()) - eq_(session.scalar(pg_functions.svg('POINT(-88.9055734203822 43.0048567324841)')), u'cx="-88.905573420382197" cy="-43.0048567324841"') + eq_(session.scalar(self.r.road_geom.svg), 'M -88.674840936305699 -43.103503229299399 L -88.6464173694267 -42.998168834394903 -88.607961955413998 -42.968073292993601 -88.516003356687904 -42.936305777070103 -88.4390925286624 -43.003184757961797') + ok_(self.r is session.query(Road).filter(Road.road_geom.svg == 'M -88.674840936305699 -43.103503229299399 L -88.6464173694267 -42.998168834394903 -88.607961955413998 -42.968073292993601 -88.516003356687904 -42.936305777070103 -88.4390925286624 -43.003184757961797').first()) + eq_(session.scalar(pg_functions.svg('POINT(-88.9055734203822 43.0048567324841)')), 'cx="-88.905573420382197" cy="-43.0048567324841"') ok_(session.query(Spot).filter(Spot.spot_location.svg == 'cx="-88.905573420382197" cy="-43.0048567324841"').first()) def test_gml(self): @@ -169,7 +169,7 @@ def test_gml(self): def test_kml(self): s = session.query(Spot).filter(Spot.spot_height==420.40).one() - eq_(session.scalar(s.spot_location.kml), u'-88.594586159235703,42.948009598726102') + eq_(session.scalar(s.spot_location.kml), '-88.594586159235703,42.948009598726102') def test_geojson(self): s = session.query(Spot).filter(Spot.spot_height==420.40).one() @@ -238,13 +238,13 @@ def test_point_n(self): r = session.query(Road).get(1) ok_(not session.scalar(l.lake_geom.point_n(1))) ok_(session.query(Road).filter(Road.road_geom.point_n(5) == WKTSpatialElement('POINT(-88.3655256496815 43.1402866687898)')).first() is not None) - eq_(session.scalar(r.road_geom.point_n(5).wkt), u'POINT(-88.3655256496815 43.1402866687898)') + eq_(session.scalar(r.road_geom.point_n(5).wkt), 'POINT(-88.3655256496815 43.1402866687898)') eq_(session.scalar(functions.wkt(functions.point_n('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)', 1))) - , u'POINT(77.29 29.07)') + , 'POINT(77.29 29.07)') def test_persistent(self): eq_(session.scalar(functions.wkt(func.ST_GeomFromWKB(self.r.road_geom.wkb, 4326))), - u'LINESTRING(-88.6748409363057 43.1035032292994,-88.6464173694267 42.9981688343949,-88.607961955414 42.9680732929936,-88.5160033566879 42.9363057770701,-88.4390925286624 43.0031847579618)') + 'LINESTRING(-88.6748409363057 43.1035032292994,-88.6464173694267 42.9981688343949,-88.607961955414 42.9680732929936,-88.5160033566879 42.9363057770701,-88.4390925286624 43.0031847579618)') geom = WKTSpatialElement('POINT(30250865.9714116 -610981.481754275)', 2249) spot = Spot(spot_height=102.34, spot_location=geom) @@ -294,18 +294,18 @@ def test_y(self): def test_centroid(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() - eq_(session.scalar(functions.wkt(r.road_geom.centroid)), u'POINT(-88.5889975373709 42.941769988935)') - eq_(session.scalar(functions.wkt(l.lake_geom.centroid)), u'POINT(-88.9214538261088 43.0191497691548)') + eq_(session.scalar(functions.wkt(r.road_geom.centroid)), 'POINT(-88.5889975373709 42.941769988935)') + eq_(session.scalar(functions.wkt(l.lake_geom.centroid)), 'POINT(-88.9214538261088 43.0191497691548)') ok_(session.query(Spot).filter(Spot.spot_location.centroid == WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)')).first() is not None) eq_(session.scalar(functions.wkt(functions.centroid('MULTIPOINT ( -1 0, -1 2, -1 3, -1 4, -1 7, 0 1, 0 3, 1 1, 2 0, 6 0, 7 8, 9 8, 10 6 )'))), - u'POINT(2.30769230769231 3.30769230769231)') + 'POINT(2.30769230769231 3.30769230769231)') def test_boundary(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() - eq_(session.scalar(functions.wkt(r.road_geom.boundary)), u'MULTIPOINT(-88.5477708726115 42.6988853949045,-88.5912422101911 43.187101955414)') + eq_(session.scalar(functions.wkt(r.road_geom.boundary)), 'MULTIPOINT(-88.5477708726115 42.6988853949045,-88.5912422101911 43.187101955414)') ok_(session.query(Road).filter(Road.road_geom.boundary == WKTSpatialElement('MULTIPOINT(-88.9139332929936 42.5082802993631,-88.3655256496815 43.1402866687898)')).first() is not None) eq_(session.scalar(functions.wkt(functions.boundary('POLYGON((1 1,0 0, -1 1, 1 1))'))), - u'LINESTRING(1 1,0 0,-1 1,1 1)') + 'LINESTRING(1 1,0 0,-1 1,1 1)') def test_buffer(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() @@ -316,35 +316,35 @@ def test_buffer(self): def test_convex_hull(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() eq_(session.scalar(functions.wkt(r.road_geom.convex_hull)), - u'POLYGON((-88.5477708726115 42.6988853949045,-88.6096339299363 42.9697452675159,-88.6029460318471 43.0884554585987,-88.5912422101911 43.187101955414,-88.5477708726115 42.6988853949045))') + 'POLYGON((-88.5477708726115 42.6988853949045,-88.6096339299363 42.9697452675159,-88.6029460318471 43.0884554585987,-88.5912422101911 43.187101955414,-88.5477708726115 42.6988853949045))') ok_(session.query(Spot).filter(Spot.spot_location.convex_hull == WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)')).first() is not None) eq_(session.scalar(functions.wkt(functions.convex_hull('POINT(-88.5945861592357 42.9480095987261)'))), - u'POINT(-88.5945861592357 42.9480095987261)') + 'POINT(-88.5945861592357 42.9480095987261)') def test_envelope(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() eq_(session.scalar(functions.wkt(r.road_geom.envelope)), - u'POLYGON((-88.6096339299363 42.6988853949045,-88.6096339299363 43.187101955414,-88.5477708726115 43.187101955414,-88.5477708726115 42.6988853949045,-88.6096339299363 42.6988853949045))') + 'POLYGON((-88.6096339299363 42.6988853949045,-88.6096339299363 43.187101955414,-88.5477708726115 43.187101955414,-88.5477708726115 42.6988853949045,-88.6096339299363 42.6988853949045))') eq_(session.scalar(functions.geometry_type(self.r.road_geom.envelope)), 'ST_Polygon') ok_(session.query(Spot).filter(Spot.spot_location.envelope == WKTSpatialElement('POINT(-88.5945861592357 42.9480095987261)')).first() is not None) eq_(session.scalar(functions.wkt(functions.envelope('POINT(-88.5945861592357 42.9480095987261)'))), - u'POINT(-88.5945861592357 42.9480095987261)') + 'POINT(-88.5945861592357 42.9480095987261)') def test_start_point(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() eq_(session.scalar(functions.wkt(r.road_geom.start_point)), - u'POINT(-88.5477708726115 42.6988853949045)') + 'POINT(-88.5477708726115 42.6988853949045)') ok_(session.query(Road).filter(Road.road_geom.start_point == WKTSpatialElement('POINT(-88.9139332929936 42.5082802993631)')).first() is not None) eq_(session.scalar(functions.wkt(functions.start_point('LINESTRING(0 1, 0 2)'))), - u'POINT(0 1)') + 'POINT(0 1)') def test_end_point(self): r = session.query(Road).filter(Road.road_name=='Graeme Ave').one() eq_(session.scalar(functions.wkt(r.road_geom.end_point)), - u'POINT(-88.5912422101911 43.187101955414)') + 'POINT(-88.5912422101911 43.187101955414)') ok_(session.query(Road).filter(Road.road_geom.end_point == WKTSpatialElement('POINT(-88.3655256496815 43.1402866687898)')).first() is not None) eq_(session.scalar(functions.wkt(functions.end_point('LINESTRING(0 1, 0 2)'))), - u'POINT(0 2)') + 'POINT(0 2)') def test_transform(self): spot = session.query(Spot).get(1) @@ -353,7 +353,7 @@ def test_transform(self): assert_almost_equal(session.scalar(functions.y(spot.spot_location.transform(2249))), 3627658.6746507999) ok_(session.query(Spot).filter(Spot.spot_location.transform(2249).wkt == 'POINT(-3890517.61095593 3627658.6746508)').first() is not None) eq_(session.scalar(functions.wkt(functions.transform(WKTSpatialElement('POLYGON((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416))', 2249), 4326))), - u'POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326 42.3903829478009,-71.1775844305465 42.3903826677917,-71.1775825927231 42.3902893647987,-71.1776848522251 42.3902896512902))') + 'POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326 42.3903829478009,-71.1775844305465 42.3903826677917,-71.1775825927231 42.3902893647987,-71.1776848522251 42.3902896512902))') # Test Geometry Relationships diff --git a/geoalchemy/tests/test_spatialite.py b/geoalchemy/tests/test_spatialite.py index a5a5e84..8b08447 100644 --- a/geoalchemy/tests/test_spatialite.py +++ b/geoalchemy/tests/test_spatialite.py @@ -116,23 +116,23 @@ def tearDown(self): def test_wkt(self): eq_(session.scalar(self.r.road_geom.wkt), 'LINESTRING(-88.674841 43.103503, -88.646417 42.998169, -88.607962 42.968073, -88.516003 42.936306, -88.439093 43.003185)') centroid_geom = DBSpatialElement(session.scalar(self.r.road_geom.centroid)) - eq_(session.scalar(centroid_geom.wkt), u'POINT(-88.576937 42.991563)') + eq_(session.scalar(centroid_geom.wkt), 'POINT(-88.576937 42.991563)') ok_(not session.query(Spot).filter(Spot.spot_location.wkt == 'POINT(0,0)').first()) ok_(session.query(Spot).get(1) is session.query(Spot).filter(Spot.spot_location == 'POINT(-88.5945861592357 42.9480095987261)').first()) - eq_(session.scalar(WKTSpatialElement('POINT(-88.5769371859941 42.9915634871979)').wkt), u'POINT(-88.576937 42.991563)') + eq_(session.scalar(WKTSpatialElement('POINT(-88.5769371859941 42.9915634871979)').wkt), 'POINT(-88.576937 42.991563)') def test_wkb(self): eq_(session.scalar(functions.wkt(func.GeomFromWKB(self.r.road_geom.wkb, 4326))), - u'LINESTRING(-88.674841 43.103503, -88.646417 42.998169, -88.607962 42.968073, -88.516003 42.936306, -88.439093 43.003185)') + 'LINESTRING(-88.674841 43.103503, -88.646417 42.998169, -88.607962 42.968073, -88.516003 42.936306, -88.439093 43.003185)') eq_(session.scalar(self.r.road_geom.wkb), self.r.road_geom.geom_wkb) centroid_geom = DBSpatialElement(session.scalar(self.r.road_geom.centroid)) eq_(session.scalar(functions.wkt(func.GeomFromWKB(centroid_geom.wkb, 4326))), - u'POINT(-88.576937 42.991563)') + 'POINT(-88.576937 42.991563)') def test_persistent(self): eq_(session.scalar(functions.wkt(func.GeomFromWKB(self.r.road_geom.wkb, 4326))), - u'LINESTRING(-88.674841 43.103503, -88.646417 42.998169, -88.607962 42.968073, -88.516003 42.936306, -88.439093 43.003185)') + 'LINESTRING(-88.674841 43.103503, -88.646417 42.998169, -88.607962 42.968073, -88.516003 42.936306, -88.439093 43.003185)') geom = WKTSpatialElement('POINT(30250865.9714116 -610981.481754275)', 2249) spot = Spot(spot_height=102.34, spot_location=geom) @@ -184,11 +184,11 @@ def test_is_valid(self): assert session.scalar(self.r.road_geom.is_valid) def test_boundary(self): - eq_(session.scalar(functions.wkt(self.r.road_geom.boundary)), u'MULTIPOINT(-88.674841 43.103503, -88.439093 43.003185)') + eq_(session.scalar(functions.wkt(self.r.road_geom.boundary)), 'MULTIPOINT(-88.674841 43.103503, -88.439093 43.003185)') def test_envelope(self): eq_(session.scalar(functions.wkt(self.r.road_geom.envelope)), - u'POLYGON((-88.674841 42.936306, -88.439093 42.936306, -88.439093 43.103503, -88.674841 43.103503, -88.674841 42.936306))') + 'POLYGON((-88.674841 42.936306, -88.439093 42.936306, -88.439093 43.103503, -88.674841 43.103503, -88.674841 42.936306))') env = WKBSpatialElement(session.scalar(func.AsBinary(self.r.road_geom.envelope))) eq_(env.geom_type(session), 'Polygon') @@ -231,12 +231,12 @@ def test_end_point(self): def test_transform(self): spot = session.query(Spot).get(1) eq_(session.scalar(functions.wkt(spot.spot_location.transform(2249))), - u'POINT(-3890517.610956 3627658.674651)') + 'POINT(-3890517.610956 3627658.674651)') ok_(session.query(Spot).filter(sqlite_functions.mbr_contains( functions.buffer(Spot.spot_location.transform(2249), 10), WKTSpatialElement('POINT(-3890517.610956 3627658.674651)', 2249))).first() is not None) eq_(session.scalar(functions.wkt(functions.transform(WKTSpatialElement('POLYGON((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416))', 2249), 4326))), - u'POLYGON((-71.177685 42.39029, -71.177684 42.390383, -71.177584 42.390383, -71.177583 42.390289, -71.177685 42.39029))') + 'POLYGON((-71.177685 42.39029, -71.177684 42.390383, -71.177584 42.390383, -71.177583 42.390289, -71.177685 42.39029))') def test_length(self): l = session.query(Lake).get(1) @@ -401,9 +401,9 @@ def test_contains(self): # Test Geometry Relations for Minimum Bounding Rectangles (MBRs) def test_mbr_equal(self): - r1 = session.query(Road).filter(Road.road_name==u'Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name==u'Peter Rd').one() - r3 = session.query(Road).filter(Road.road_name==u'Paul St').one() + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Peter Rd').one() + r3 = session.query(Road).filter(Road.road_name=='Paul St').one() equal_roads = session.query(Road).filter(Road.road_geom.mbr_equal(r1.road_geom)).all() ok_(r1 in equal_roads) ok_(r2 in equal_roads) @@ -412,25 +412,25 @@ def test_mbr_equal(self): eq_(session.scalar(sqlite_functions.mbr_equal('POINT(-88.5945861592357 42.9480095987261)', 'POINT(-88.5945861592357 42.9480095987261)')), True) def test_mbr_disjoint(self): - r1 = session.query(Road).filter(Road.road_name==u'Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name==u'Graeme Ave').one() - r3 = session.query(Road).filter(Road.road_name==u'Geordie Rd').one() + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() disjoint_roads = session.query(Road).filter(Road.road_geom.mbr_disjoint(r1.road_geom)).all() ok_(r2 not in disjoint_roads) ok_(r3 in disjoint_roads) def test_mbr_intersects(self): - r1 = session.query(Road).filter(Road.road_name==u'Jeff Rd').one() - r2 = session.query(Road).filter(Road.road_name==u'Graeme Ave').one() - r3 = session.query(Road).filter(Road.road_name==u'Geordie Rd').one() + r1 = session.query(Road).filter(Road.road_name=='Jeff Rd').one() + r2 = session.query(Road).filter(Road.road_name=='Graeme Ave').one() + r3 = session.query(Road).filter(Road.road_name=='Geordie Rd').one() intersecting_roads = session.query(Road).filter(Road.road_geom.mbr_intersects(r1.road_geom)).all() ok_(r2 in intersecting_roads) ok_(r3 not in intersecting_roads) def test_mbr_touches(self): - l1 = session.query(Lake).filter(Lake.lake_name==u'Lake White').one() - l2 = session.query(Lake).filter(Lake.lake_name==u'Lake Blue').one() - r = session.query(Road).filter(Road.road_name==u'Geordie Rd').one() + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() + l2 = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + r = session.query(Road).filter(Road.road_name=='Geordie Rd').one() touching_lakes = session.query(Lake).filter(Lake.lake_geom.mbr_touches(r.road_geom)).all() ok_(not session.scalar(l1.lake_geom.mbr_touches(r.road_geom))) ok_(not session.scalar(l2.lake_geom.mbr_touches(r.road_geom))) @@ -438,7 +438,7 @@ def test_mbr_touches(self): ok_(l2 not in touching_lakes) def test_mbr_within(self): - l = session.query(Lake).filter(Lake.lake_name==u'Lake Blue').one() + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() spots_within = session.query(Spot).filter(Spot.spot_location.mbr_within(l.lake_geom)).all() @@ -448,9 +448,9 @@ def test_mbr_within(self): ok_(p2 not in spots_within) def test_mbr_overlaps(self): - l1 = session.query(Lake).filter(Lake.lake_name==u'Lake White').one() - l2 = session.query(Lake).filter(Lake.lake_name==u'Lake Blue').one() - l3 = session.query(Lake).filter(Lake.lake_name==u'My Lake').one() + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() + l2 = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + l3 = session.query(Lake).filter(Lake.lake_name=='My Lake').one() overlapping_lakes = session.query(Lake).filter(Lake.lake_geom.mbr_overlaps(l3.lake_geom)).all() ok_(not session.scalar(l1.lake_geom.mbr_overlaps(l3.lake_geom))) ok_(session.scalar(l2.lake_geom.mbr_overlaps(l3.lake_geom))) @@ -458,8 +458,8 @@ def test_mbr_overlaps(self): ok_(l2 in overlapping_lakes) def test_mbr_contains(self): - l = session.query(Lake).filter(Lake.lake_name==u'Lake Blue').one() - l1 = session.query(Lake).filter(Lake.lake_name==u'Lake White').one() + l = session.query(Lake).filter(Lake.lake_name=='Lake Blue').one() + l1 = session.query(Lake).filter(Lake.lake_name=='Lake White').one() p1 = session.query(Spot).filter(Spot.spot_height==102.34).one() p2 = session.query(Spot).filter(Spot.spot_height==388.62).one() containing_lakes = session.query(Lake).filter(Lake.lake_geom.mbr_contains(p1.spot_location)).all() diff --git a/setup.py b/setup.py index 7ac7028..ee0dc41 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,10 @@ from setuptools import setup, find_packages -version = '0.7.3dev' +version = '0.8.2dev' setup(name='GeoAlchemy', version=version, - description="Using SQLAlchemy with Spatial Databases", + description="Using SQLAlchemy with Spatial Databases.", long_description=open('README.rst').read(), classifiers=[ "Development Status :: 3 - Alpha", @@ -26,7 +26,8 @@ include_package_data=True, zip_safe=False, install_requires=[ - 'SQLAlchemy>=0.6.1', + 'SQLAlchemy>=1.0.9', + 'six' ], entry_points=""" # -*- Entry points: -*-