2011-12-05 22:32:37 +01:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
2015-02-02 19:31:16 +01:00
from nose . tools import eq_ , assert_almost_equal , raises
2013-06-03 04:28:24 +02:00
from utilities import execution_path , run_all
2011-12-05 22:32:37 +01:00
import os , mapnik
2015-03-22 04:08:43 +01:00
try :
import json
except ImportError :
import simplejson as json
2011-12-05 22:32:37 +01:00
def setup ( ) :
# All of the paths used are relative, if we run the tests
# from another directory we need to chdir()
os . chdir ( execution_path ( ' . ' ) )
2012-09-05 13:53:37 +02:00
if ' ogr ' in mapnik . DatasourceCache . plugin_names ( ) :
2012-02-24 22:13:56 +01:00
2011-12-05 22:32:37 +01:00
# Shapefile initialization
def test_shapefile_init ( ) :
2015-02-10 00:46:00 +01:00
ds = mapnik . Ogr ( file = ' ../../demo/data/boundaries.shp ' , layer_by_index = 0 )
e = ds . envelope ( )
2011-12-05 22:32:37 +01:00
assert_almost_equal ( e . minx , - 11121.6896651 , places = 7 )
assert_almost_equal ( e . miny , - 724724.216526 , places = 6 )
assert_almost_equal ( e . maxx , 2463000.67866 , places = 5 )
assert_almost_equal ( e . maxy , 1649661.267 , places = 3 )
2015-02-10 00:46:00 +01:00
meta = ds . describe ( )
eq_ ( meta [ ' geometry_type ' ] , mapnik . DataGeometryType . Polygon )
eq_ ( ' +proj=lcc ' in meta [ ' proj4 ' ] , True )
2012-02-24 22:13:56 +01:00
2011-12-05 22:32:37 +01:00
# Shapefile properties
def test_shapefile_properties ( ) :
2012-06-27 03:25:56 +02:00
ds = mapnik . Ogr ( file = ' ../../demo/data/boundaries.shp ' , layer_by_index = 0 )
2013-05-24 10:32:48 +02:00
f = ds . features_at_point ( ds . envelope ( ) . center ( ) , 0.001 ) . features [ 0 ]
2012-01-18 00:43:01 +01:00
eq_ ( ds . geometry_type ( ) , mapnik . DataGeometryType . Polygon )
2012-02-24 22:13:56 +01:00
2011-12-05 22:32:37 +01:00
eq_ ( f [ ' CGNS_FID ' ] , u ' 6f733341ba2011d892e2080020a0f4c9 ' )
eq_ ( f [ ' COUNTRY ' ] , u ' CAN ' )
eq_ ( f [ ' F_CODE ' ] , u ' FA001 ' )
eq_ ( f [ ' NAME_EN ' ] , u ' Quebec ' )
eq_ ( f [ ' Shape_Area ' ] , 1512185733150.0 )
eq_ ( f [ ' Shape_Leng ' ] , 19218883.724300001 )
2015-02-10 00:46:00 +01:00
meta = ds . describe ( )
eq_ ( meta [ ' geometry_type ' ] , mapnik . DataGeometryType . Polygon )
2013-06-04 00:19:33 +02:00
# NOTE: encoding is latin1 but gdal >= 1.9 should now expose utf8 encoded features
# See SHAPE_ENCODING for overriding: http://gdal.org/ogr/drv_shapefile.html
# Failure for the NOM_FR field is expected for older gdal
#eq_(f['NOM_FR'], u'Qu\xe9bec')
#eq_(f['NOM_FR'], u'Québec')
2011-12-05 22:32:37 +01:00
2011-12-05 22:33:37 +01:00
@raises ( RuntimeError )
def test_that_nonexistant_query_field_throws ( * * kwargs ) :
ds = mapnik . Ogr ( file = ' ../data/shp/world_merc.shp ' , layer_by_index = 0 )
eq_ ( len ( ds . fields ( ) ) , 11 )
eq_ ( ds . fields ( ) , [ ' FIPS ' , ' ISO2 ' , ' ISO3 ' , ' UN ' , ' NAME ' , ' AREA ' , ' POP2005 ' , ' REGION ' , ' SUBREGION ' , ' LON ' , ' LAT ' ] )
eq_ ( ds . field_types ( ) , [ ' str ' , ' str ' , ' str ' , ' int ' , ' str ' , ' int ' , ' int ' , ' int ' , ' int ' , ' float ' , ' float ' ] )
query = mapnik . Query ( ds . envelope ( ) )
for fld in ds . fields ( ) :
query . add_property_name ( fld )
# also add an invalid one, triggering throw
query . add_property_name ( ' bogus ' )
2015-02-02 19:31:16 +01:00
ds . features ( query )
2011-12-05 22:32:37 +01:00
2012-11-28 03:06:31 +01:00
# disabled because OGR prints an annoying error: ERROR 1: Invalid Point object. Missing 'coordinates' member.
#def test_handling_of_null_features():
2013-06-13 22:34:34 +02:00
# ds = mapnik.Ogr(file='../data/json/null_feature.geojson',layer_by_index=0)
2012-11-28 03:06:31 +01:00
# fs = ds.all_features()
# eq_(len(fs),1)
2011-12-05 22:32:37 +01:00
2014-08-12 20:44:34 +02:00
# OGR plugin extent parameter
def test_ogr_extent_parameter ( ) :
ds = mapnik . Ogr ( file = ' ../data/shp/world_merc.shp ' , layer_by_index = 0 , extent = ' -1,-1,1,1 ' )
e = ds . envelope ( )
eq_ ( e . minx , - 1 )
eq_ ( e . miny , - 1 )
eq_ ( e . maxx , 1 )
eq_ ( e . maxy , 1 )
2015-02-10 00:46:00 +01:00
meta = ds . describe ( )
eq_ ( meta [ ' geometry_type ' ] , mapnik . DataGeometryType . Polygon )
eq_ ( ' +proj=merc ' in meta [ ' proj4 ' ] , True )
2014-08-12 20:44:34 +02:00
2014-08-16 04:48:27 +02:00
def test_ogr_reading_gpx_waypoint ( ) :
ds = mapnik . Ogr ( file = ' ../data/gpx/empty.gpx ' , layer = ' waypoints ' )
e = ds . envelope ( )
eq_ ( e . minx , - 122 )
eq_ ( e . miny , 48 )
eq_ ( e . maxx , - 122 )
eq_ ( e . maxy , 48 )
2015-02-10 00:46:00 +01:00
meta = ds . describe ( )
eq_ ( meta [ ' geometry_type ' ] , mapnik . DataGeometryType . Point )
eq_ ( ' +proj=longlat ' in meta [ ' proj4 ' ] , True )
2014-08-16 04:48:27 +02:00
def test_ogr_empty_data_should_not_throw ( ) :
default_logging_severity = mapnik . logger . get_severity ( )
mapnik . logger . set_severity ( mapnik . severity_type . None )
# use logger to silence expected warnings
for layer in [ ' routes ' , ' tracks ' , ' route_points ' , ' track_points ' ] :
ds = mapnik . Ogr ( file = ' ../data/gpx/empty.gpx ' , layer = layer )
e = ds . envelope ( )
eq_ ( e . minx , 0 )
eq_ ( e . miny , 0 )
eq_ ( e . maxx , 0 )
eq_ ( e . maxy , 0 )
mapnik . logger . set_severity ( default_logging_severity )
2015-02-10 00:46:00 +01:00
meta = ds . describe ( )
eq_ ( meta [ ' geometry_type ' ] , mapnik . DataGeometryType . Point )
eq_ ( ' +proj=longlat ' in meta [ ' proj4 ' ] , True )
2014-08-16 04:48:27 +02:00
# disabled because OGR prints an annoying error: ERROR 1: Invalid Point object. Missing 'coordinates' member.
#def test_handling_of_null_features():
# ds = mapnik.Ogr(file='../data/json/null_feature.geojson',layer_by_index=0)
# fs = ds.all_features()
# eq_(len(fs),1)
2015-03-22 04:08:43 +01:00
def test_geometry_type ( ) :
ds = mapnik . Ogr ( file = ' ../data/csv/wkt.vrt ' , layer_by_index = 0 )
e = ds . envelope ( )
assert_almost_equal ( e . minx , 1.0 , places = 1 )
assert_almost_equal ( e . miny , 1.0 , places = 1 )
assert_almost_equal ( e . maxx , 45.0 , places = 1 )
assert_almost_equal ( e . maxy , 45.0 , places = 1 )
meta = ds . describe ( )
eq_ ( meta [ ' geometry_type ' ] , mapnik . DataGeometryType . Point )
eq_ ( ' +proj=longlat ' in meta [ ' proj4 ' ] , True )
fs = ds . featureset ( )
feat = fs . next ( )
actual = json . loads ( feat . to_geojson ( ) )
eq_ ( actual , { u ' geometry ' : { u ' type ' : u ' Point ' , u ' coordinates ' : [ 30 , 10 ] } , u ' type ' : u ' Feature ' , u ' id ' : 2 , u ' properties ' : { u ' type ' : u ' point ' , u ' WKT ' : u ' POINT (30 10) ' } } )
feat = fs . next ( )
actual = json . loads ( feat . to_geojson ( ) )
eq_ ( actual , { u ' geometry ' : { u ' type ' : u ' LineString ' , u ' coordinates ' : [ [ 30 , 10 ] , [ 10 , 30 ] , [ 40 , 40 ] ] } , u ' type ' : u ' Feature ' , u ' id ' : 3 , u ' properties ' : { u ' type ' : u ' linestring ' , u ' WKT ' : u ' LINESTRING (30 10, 10 30, 40 40) ' } } )
feat = fs . next ( )
actual = json . loads ( feat . to_geojson ( ) )
eq_ ( actual , { u ' geometry ' : { u ' type ' : u ' Polygon ' , u ' coordinates ' : [ [ [ 30 , 10 ] , [ 10 , 20 ] , [ 20 , 40 ] , [ 40 , 40 ] , [ 30 , 10 ] ] ] } , u ' type ' : u ' Feature ' , u ' id ' : 4 , u ' properties ' : { u ' type ' : u ' polygon ' , u ' WKT ' : u ' POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10)) ' } } )
feat = fs . next ( )
actual = json . loads ( feat . to_geojson ( ) )
eq_ ( actual , { u ' geometry ' : { u ' type ' : u ' Polygon ' , u ' coordinates ' : [ [ [ 35 , 10 ] , [ 10 , 20 ] , [ 15 , 40 ] , [ 45 , 45 ] , [ 35 , 10 ] ] , [ [ 20 , 30 ] , [ 35 , 35 ] , [ 30 , 20 ] , [ 20 , 30 ] ] ] } , u ' type ' : u ' Feature ' , u ' id ' : 5 , u ' properties ' : { u ' type ' : u ' polygon ' , u ' WKT ' : u ' POLYGON ((35 10, 10 20, 15 40, 45 45, 35 10),(20 30, 35 35, 30 20, 20 30)) ' } } )
feat = fs . next ( )
actual = json . loads ( feat . to_geojson ( ) )
eq_ ( actual , { u ' geometry ' : { u ' type ' : u ' MultiPoint ' , u ' coordinates ' : [ [ 10 , 40 ] , [ 40 , 30 ] , [ 20 , 20 ] , [ 30 , 10 ] ] } , u ' type ' : u ' Feature ' , u ' id ' : 6 , u ' properties ' : { u ' type ' : u ' multipoint ' , u ' WKT ' : u ' MULTIPOINT ((10 40), (40 30), (20 20), (30 10)) ' } } )
feat = fs . next ( )
actual = json . loads ( feat . to_geojson ( ) )
eq_ ( actual , { u ' geometry ' : { u ' type ' : u ' MultiLineString ' , u ' coordinates ' : [ [ [ 10 , 10 ] , [ 20 , 20 ] , [ 10 , 40 ] ] , [ [ 40 , 40 ] , [ 30 , 30 ] , [ 40 , 20 ] , [ 30 , 10 ] ] ] } , u ' type ' : u ' Feature ' , u ' id ' : 7 , u ' properties ' : { u ' type ' : u ' multilinestring ' , u ' WKT ' : u ' MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10)) ' } } )
feat = fs . next ( )
actual = json . loads ( feat . to_geojson ( ) )
eq_ ( actual , { u ' geometry ' : { u ' type ' : u ' MultiPolygon ' , u ' coordinates ' : [ [ [ [ 30 , 20 ] , [ 10 , 40 ] , [ 45 , 40 ] , [ 30 , 20 ] ] ] , [ [ [ 15 , 5 ] , [ 40 , 10 ] , [ 10 , 20 ] , [ 5 , 10 ] , [ 15 , 5 ] ] ] ] } , u ' type ' : u ' Feature ' , u ' id ' : 8 , u ' properties ' : { u ' type ' : u ' multipolygon ' , u ' WKT ' : u ' MULTIPOLYGON (((30 20, 10 40, 45 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5))) ' } } )
feat = fs . next ( )
actual = json . loads ( feat . to_geojson ( ) )
eq_ ( actual , { u ' geometry ' : { u ' type ' : u ' MultiPolygon ' , u ' coordinates ' : [ [ [ [ 40 , 40 ] , [ 20 , 45 ] , [ 45 , 30 ] , [ 40 , 40 ] ] ] , [ [ [ 20 , 35 ] , [ 45 , 20 ] , [ 30 , 5 ] , [ 10 , 10 ] , [ 10 , 30 ] , [ 20 , 35 ] ] , [ [ 30 , 20 ] , [ 20 , 25 ] , [ 20 , 15 ] , [ 30 , 20 ] ] ] ] } , u ' type ' : u ' Feature ' , u ' id ' : 9 , u ' properties ' : { u ' type ' : u ' multipolygon ' , u ' WKT ' : u ' MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)),((20 35, 45 20, 30 5, 10 10, 10 30, 20 35),(30 20, 20 25, 20 15, 30 20))) ' } } )
feat = fs . next ( )
actual = json . loads ( feat . to_geojson ( ) )
eq_ ( actual , { u ' geometry ' : { u ' type ' : u ' GeometryCollection ' , u ' geometries ' : [ { u ' type ' : u ' Polygon ' , u ' coordinates ' : [ [ [ 1 , 1 ] , [ 2 , 1 ] , [ 2 , 2 ] , [ 1 , 2 ] , [ 1 , 1 ] ] ] } , { u ' type ' : u ' Point ' , u ' coordinates ' : [ 2 , 3 ] } , { u ' type ' : u ' LineString ' , u ' coordinates ' : [ [ 2 , 3 ] , [ 3 , 4 ] ] } ] } , u ' type ' : u ' Feature ' , u ' id ' : 10 , u ' properties ' : { u ' type ' : u ' collection ' , u ' WKT ' : u ' GEOMETRYCOLLECTION(POLYGON((1 1,2 1,2 2,1 2,1 1)),POINT(2 3),LINESTRING(2 3,3 4)) ' } } )
2011-12-05 22:32:37 +01:00
if __name__ == " __main__ " :
setup ( )
2014-07-14 18:34:20 +02:00
exit ( run_all ( eval ( x ) for x in dir ( ) if x . startswith ( " test_ " ) ) )