add node grids for tests and test for interpolation update

This commit is contained in:
Sarah Hoffmann 2017-01-09 20:41:57 +01:00
parent 0916d72ddf
commit e04838cc71
3 changed files with 97 additions and 2 deletions

View File

@ -196,6 +196,15 @@ class OSMDataFactory(object):
return scene
def clear_grid(self):
self.grid = {}
def add_grid_node(self, nodeid, x, y):
self.grid[nodeid] = (x, y)
def grid_node(self, nodeid):
return self.grid.get(nodeid)
def before_all(context):
# logging setup

View File

@ -0,0 +1,40 @@
@DB
Feature: Update of interpolations
@wip
# Test case for #598
Scenario: add an interpolation way
Given the grid
| 4 | 7 | 5 |
| 10| | 12|
When loading osm data
"""
n3
n4 Taddr:housenumber=1
n5 Taddr:housenumber=5
n10
n12
w11 Thighway=residential,name=X Nn4,n5
w12 Thighway=residential,name=Highway Nn10,n12
"""
And updating osm data
"""
n4 Taddr:housenumber=1
n5 Taddr:housenumber=5
w1 Taddr:interpolation=odd Nn4,n5
w2 Tbuilding=yes,name=ggg Nn4,n10,n7,n4
w3 Tbuilding=yes,name=ggg Nn4,n10,n7,n4
w4 Tbuilding=yes,name=ggg Nn4,n10,n7,n4
w5 Tbuilding=yes,name=ggg Nn4,n10,n7,n4
w6 Tbuilding=yes,name=ggg Nn4,n10,n7,n4
w7 Tbuilding=yes,name=ggg Nn4,n10,n7,n4
w11 dD
"""
Then place contains
| object | housenumber |
| N4:place | 1 |
| N5:place | 5 |
| W1:place | odd |
And W1 expands to interpolation
| start | end |
| 1 | 5 |

View File

@ -4,16 +4,52 @@ import random
import os
from nose.tools import * # for assert functions
@given(u'the (\d+ )?grid')
def define_node_grid(context, grid_step):
"""
Define a grid of node positions.
"""
if grid_step is not None:
grid_step = int(grd_step.strip())
else:
grid_step = 0.00001
context.osm.clear_grid()
i = 0
for h in context.table.headings:
if h.isdigit():
context.osm.add_grid_node(int(h), 0, i)
i += grid_step
x = grid_step
for r in context.table:
y = 0
for h in r:
if h.isdigit():
context.osm.add_grid_node(int(h), x, y)
y += grid_step
x += grid_step
@when(u'loading osm data')
def load_osm_file(context):
"""
Load the given data into a freshly created test data using osm2pgsql.
No further indexing is done.
The data is expected as attached text in OPL format.
"""
# create a OSM file in /tmp and import it
with tempfile.NamedTemporaryFile(dir='/tmp', suffix='.opl', delete=False) as fd:
fname = fd.name
for line in context.text.splitlines():
if line.startswith('n') and line.find(' x') < 0:
line += " x%d y%d" % (random.random() * 360 - 180,
random.random() * 180 - 90)
coord = context.osm.grid_node(int(line[1:].split(' ')[0]))
if coord is None:
coord = (random.random() * 360 - 180,
random.random() * 180 - 90)
line += " x%f y%f" % coord
fd.write(line.encode('utf-8'))
fd.write(b'\n')
@ -33,12 +69,22 @@ def load_osm_file(context):
@when(u'updating osm data')
def update_from_osm_file(context):
"""
Update a database previously populated with 'loading osm data'.
Needs to run indexing on the existing data first to yield the correct result.
The data is expected as attached text in OPL format.
"""
context.nominatim.run_setup_script('create-functions', 'create-partition-functions')
cur = context.db.cursor()
cur.execute("""insert into placex (osm_type, osm_id, class, type, name,
admin_level, housenumber, street, addr_place, isin, postcode,
country_code, extratags, geometry) select * from place""")
cur.execute(
"""select insert_osmline (osm_id, housenumber, street, addr_place,
postcode, country_code, geometry)
from place where class='place' and type='houses' and osm_type='W'""")
context.db.commit()
context.nominatim.run_setup_script('index', 'index-noanalyse')
context.nominatim.run_setup_script('create-functions', 'create-partition-functions',