Note

# Using two spatial weights matrices#

Some functions are using spatial weights for two different purposes. Therefore two matrices have to be passed. We will illustrate this case measuring building adjacency and mean interbuilding distance.

```
[1]:
```

```
import momepy
import geopandas as gpd
import matplotlib.pyplot as plt
```

We will again use `osmnx`

to get the data for our example and after preprocessing of building layer will generate tessellation.

```
[2]:
```

```
import osmnx as ox
gdf = ox.geometries.geometries_from_place('Kahla, Germany', tags={'building':True})
buildings = ox.projection.project_gdf(gdf)
buildings['uID'] = momepy.unique_id(buildings)
limit = momepy.buffered_limit(buildings)
tessellation = momepy.Tessellation(buildings, unique_id='uID', limit=limit,
verbose=False).tessellation
```

```
/Users/martin/Git/geopandas/geopandas/geoseries.py:190: DeprecationWarning: The default dtype for empty Series will be 'object' instead of 'float64' in a future version. Specify a dtype explicitly to silence this warning.
s = pd.Series(data, index=index, name=name, **kwargs)
```

## Building adjacency#

Building adjacency is using `spatial_weights_higher`

to denote the area within which the calculation occurs (required) and `spatial_weights`

to denote adjacency of buildings (optional, the function can do it for us). We can use distance band of 200 meters to define `spatial_weights_higher`

.

```
[3]:
```

```
import libpysal
dist200 = libpysal.weights.DistanceBand.from_dataframe(buildings, 200,
ids='uID')
```

```
/opt/miniconda3/envs/geo_dev/lib/python3.9/site-packages/libpysal/weights/weights.py:172: UserWarning: The weights matrix is not fully connected:
There are 7 disconnected components.
There are 3 islands with ids: 330, 578, 2495.
warnings.warn(message)
```

```
[4]:
```

```
adjac = momepy.BuildingAdjacency(
buildings, spatial_weights_higher=dist200, unique_id='uID')
buildings['adjacency'] = adjac.series
```

```
Calculating spatial weights...
Spatial weights ready...
```

```
[5]:
```

```
f, ax = plt.subplots(figsize=(10, 10))
buildings.plot(ax=ax, column='adjacency', legend=True, cmap='viridis', scheme='naturalbreaks', k=10)
ax.set_axis_off()
plt.show()
```

If we want to specify or reuse `spatial_weights`

, we can generate them as Queen contiguity weights. Using `libpysal`

or `momepy`

(momepy will use the same libpysal method, but you donâ€™t need to import libpysal directly):

```
[6]:
```

```
queen = libpysal.weights.Queen.from_dataframe(buildings,
silence_warnings=True,
ids='uID')
queen = momepy.sw_high(k=1, gdf=buildings, ids='uID', contiguity='queen')
```

```
[7]:
```

```
buildings['adj2'] = momepy.BuildingAdjacency(buildings,
spatial_weights_higher=dist200,
unique_id='uID',
spatial_weights=queen).series
```

```
[8]:
```

```
f, ax = plt.subplots(figsize=(10, 10))
buildings.plot(ax=ax, column='adj2', legend=True, cmap='viridis')
ax.set_axis_off()
plt.show()
```

## Mean interbuilding distance#

Mean interbuilding distance is similar to `neighbour_distance`

, but it is calculated within vicinity defined in `spatial_weights_higher`

, while `spatial_weights`

captures immediate neighbours.

```
[9]:
```

```
sw1 = momepy.sw_high(k=1, gdf=tessellation, ids='uID')
sw3 = momepy.sw_high(k=3, gdf=tessellation, ids='uID')
```

```
[10]:
```

```
interblg_distance = momepy.MeanInterbuildingDistance(
buildings, sw1, 'uID', spatial_weights_higher=sw3)
buildings['mean_ib_dist'] = interblg_distance.series
```

```
Computing mean interbuilding distances...
```

```
/opt/miniconda3/envs/geo_dev/lib/python3.9/site-packages/pygeos/measurement.py:70: RuntimeWarning: overflow encountered in distance
return lib.distance(a, b, **kwargs)
```

`spatial_weights_higher`

is optional and can be derived from `spatial_weights`

as weights of higher order defined in `order`

.

```
[11]:
```

```
buildings['mean_ib_dist'] = momepy.MeanInterbuildingDistance(
buildings, sw1, 'uID', order=3).series
```

```
Computing mean interbuilding distances...
```

```
/opt/miniconda3/envs/geo_dev/lib/python3.9/site-packages/pygeos/measurement.py:70: RuntimeWarning: overflow encountered in distance
return lib.distance(a, b, **kwargs)
```

```
[12]:
```

```
f, ax = plt.subplots(figsize=(10, 10))
buildings.plot(ax=ax, column='mean_ib_dist', scheme='quantiles', k=10, legend=True, cmap='viridis')
ax.set_axis_off()
plt.show()
```