def test_proportion_overlap(loader): # Calculate proportion of each parcel overlapped by water. parcels = loader.tables.sample.heather_farms water = loader.tables.sample.hf_water assert not hasattr(parcels, 'proportion_water') spatialtoolz.proportion_overlap(parcels, water, 'proportion_water') assert hasattr(parcels, 'proportion_water') # Build DataFrame from columns of parcels table. columns = [parcels.parcel_id, parcels.geom.ST_Area(), parcels.proportion_water] parcels_df = db_to_df(columns, index_col='parcel_id') # Assert that proportion overlap values are between 0 and 1. assert parcels_df.proportion_water.dtype == float assert not (parcels_df.proportion_water < 0).any() assert not (parcels_df.proportion_water > 1).any() # Assert that sum of overlapped parcel area is <= total water area. with loader.database.session() as sess: overlapped_area = sess.query( func.sum(parcels.proportion_water * parcels.geom.ST_Area()) ).scalar() water_area = sess.query(func.sum(water.geom.ST_Area())).scalar() assert overlapped_area <= water_area
def test_proportion_overlap(loader): # Calculate proportion of each parcel overlapped by water. parcels = loader.tables.sample.heather_farms water = loader.tables.sample.hf_water assert not hasattr(parcels, 'proportion_water') spatialtoolz.proportion_overlap(parcels, water, 'proportion_water') assert hasattr(parcels, 'proportion_water') # Build DataFrame from columns of parcels table. columns = [ parcels.parcel_id, parcels.geom.ST_Area(), parcels.proportion_water ] parcels_df = db_to_df(columns, index_col='parcel_id') # Assert that proportion overlap values are between 0 and 1. assert parcels_df.proportion_water.dtype == float assert not (parcels_df.proportion_water < 0).any() assert not (parcels_df.proportion_water > 1).any() # Assert that sum of overlapped parcel area is <= total water area. with loader.database.session() as sess: overlapped_area = sess.query( func.sum(parcels.proportion_water * parcels.geom.ST_Area())).scalar() water_area = sess.query(func.sum(water.geom.ST_Area())).scalar() assert overlapped_area <= water_area
def test_tag(loader): # Tag parcels with block group ID. parcels = loader.tables.sample.heather_farms bg = loader.tables.sample.hf_bg assert not hasattr(parcels, 'bg_id') spatialtoolz.tag(parcels, 'bg_id', bg, 'objectid') assert hasattr(parcels, 'bg_id') # Build DataFrame from parcels and block groups tables. parcels_df = db_to_df(parcels, index_col='parcel_id') bg_df = db_to_df(bg, index_col='objectid') # Assert that all parcels have integer block groups. assert not parcels_df.bg_id.isnull().any() assert np.issubdtype(parcels_df.bg_id.dtype, int) # Assert that there are at least 10 unique parcel block groups. parcels_bg_ids = parcels_df.bg_id.unique() assert len(parcels_bg_ids) >= 10 # Assert that parcel block groups are a subset of all block groups. assert np.all([bg_id in bg_df.index for bg_id in parcels_bg_ids])
def test_sim_export(loader): # Try importing the UrbanSim simulation framework, otherwise skip test. sim = pytest.importorskip('urbansim.sim.simulation') # Register input parcels table. parcels = loader.tables.sample.heather_farms parcels_in = TableFrame(parcels, index_col='gid') sim.add_table('parcels_in', parcels_in, copy_col=False) # Register output parcels table. @sim.table() def parcels_out(parcels_in): return pd.DataFrame(index=parcels_in.parcel_id) # Specify default table for output columns as decorator. out = sim.column('parcels_out') # Specify some output columns. @out def apn(apn='parcels_in.puid'): return apn.groupby(parcels_in.parcel_id).first().astype(str) @out def county_id(): return 13 @out def area(acr='parcels_in.parcel_acr'): return 4047. * acr.groupby(parcels_in.parcel_id).median() # Register model to export output table to database. @sim.model() def export(parcels_out): schema = loader.tables.sample df_to_db(parcels_out.to_frame(), 'parcels_out', schema=schema) # Inspect output table. column_names = ['apn', 'county_id', 'area'] parcels_out_df1 = sim.get_table('parcels_out').to_frame() assert set(parcels_out_df1.columns) == set(column_names) assert parcels_out_df1.county_id.unique() == [13] # Export table to database and import back to compare. sim.run(['export']) parcels_out_table = loader.tables.sample.parcels_out parcels_out_df2 = db_to_df(parcels_out_table, index_col='parcel_id') pdt.assert_frame_equal(parcels_out_df1[column_names], parcels_out_df2[column_names])