5
5
# definitions of spatial distribution characters
6
6
7
7
import math
8
- import warnings
9
8
10
9
import networkx as nx
11
10
import numpy as np
16
15
17
16
__all__ = [
18
17
"Orientation" ,
18
+ "SharedWalls" ,
19
19
"SharedWallsRatio" ,
20
20
"StreetAlignment" ,
21
21
"CellAlignment" ,
@@ -106,7 +106,55 @@ def _dist(a, b):
106
106
self .series = pd .Series (results_list , index = gdf .index )
107
107
108
108
109
- class SharedWallsRatio :
109
+ class SharedWalls :
110
+ """
111
+ Calculate the length of shared walls of adjacent elements (typically buildings)
112
+
113
+ .. math::
114
+ \\ textit{length of shared walls}
115
+
116
+ Note that data needs to be topologically correct. Overlapping polygons will lead to
117
+ incorrect results.
118
+
119
+ Adapted from :cite:`hamaina2012a`.
120
+
121
+ Parameters
122
+ ----------
123
+ gdf : GeoDataFrame
124
+ GeoDataFrame containing gdf to analyse
125
+
126
+ Attributes
127
+ ----------
128
+ series : Series
129
+ Series containing resulting values
130
+ gdf : GeoDataFrame
131
+ original GeoDataFrame
132
+
133
+ Examples
134
+ --------
135
+ >>> buildings_df['swr'] = momepy.SharedWalls(buildings_df).series
136
+
137
+ See also
138
+ --------
139
+ SharedWallsRatio
140
+ """
141
+
142
+ def __init__ (self , gdf ):
143
+ self .gdf = gdf
144
+
145
+ inp , res = gdf .sindex .query_bulk (gdf .geometry , predicate = "intersects" )
146
+ left = gdf .geometry .take (inp ).reset_index (drop = True )
147
+ right = gdf .geometry .take (res ).reset_index (drop = True )
148
+ intersections = left .intersection (right ).length
149
+ results = intersections .groupby (inp ).sum ().reset_index (
150
+ drop = True
151
+ ) - gdf .geometry .length .reset_index (drop = True )
152
+ results .index = gdf .index
153
+
154
+ self .series = results
155
+
156
+
157
+ class SharedWallsRatio (SharedWalls ):
110
158
"""
111
159
Calculate shared walls ratio of adjacent elements (typically buildings)
112
160
@@ -122,8 +170,7 @@ class SharedWallsRatio:
122
170
----------
123
171
gdf : GeoDataFrame
124
172
GeoDataFrame containing gdf to analyse
125
- unique_id : (deprecated)
126
- perimeters : str, list, np.array, pd.Series (default None)
173
+ perimeters : str, list, np.array, pd.Series (default None, optional)
127
174
the name of the dataframe column, ``np.array``, or ``pd.Series`` where is stored perimeter value
128
175
129
176
Attributes
@@ -140,15 +187,14 @@ class SharedWallsRatio:
140
187
>>> buildings_df['swr'] = momepy.SharedWallsRatio(buildings_df).series
141
188
>>> buildings_df['swr'][10]
142
189
0.3424804411228673
143
- """
144
190
145
- def __init__ (self , gdf , unique_id = None , perimeters = None ):
146
- if unique_id is not None :
147
- warnings .warn (
148
- "unique_id is deprecated and will be removed in v0.4." , FutureWarning ,
149
- )
191
+ See also
192
+ --------
193
+ SharedWalls
194
+ """
150
195
151
- self .gdf = gdf
196
+ def __init__ (self , gdf , perimeters = None ):
197
+ super (SharedWallsRatio , self ).__init__ (gdf )
152
198
153
199
if perimeters is None :
154
200
self .perimeters = gdf .geometry .length
@@ -157,17 +203,7 @@ def __init__(self, gdf, unique_id=None, perimeters=None):
157
203
else :
158
204
self .perimeters = perimeters
159
205
160
- inp , res = gdf .sindex .query_bulk (gdf .geometry , predicate = "intersects" )
161
- left = gdf .geometry .take (inp ).reset_index (drop = True )
162
- right = gdf .geometry .take (res ).reset_index (drop = True )
163
- intersections = left .intersection (right ).length
164
- results = (
165
- intersections .groupby (inp ).sum ().reset_index (drop = True )
166
- - self .perimeters .reset_index (drop = True )
167
- ) / self .perimeters .reset_index (drop = True )
168
- results .index = gdf .index
169
-
170
- self .series = results
206
+ self .series = self .series / self .perimeters
171
207
172
208
173
209
class StreetAlignment :
0 commit comments