Make calculating overlapping areas faster

By using the simplified polygons instead of the full resolutions ones
we:
- query less data from SQLite
- pass less data around
- give Shapely a less complicated shape to do its calculations on

This makes it faster to calculate how much of each electoral ward a
custom area overlaps.

For the two areas in our tests:

Place represented by custom area | Before | After
---------------------------------|--------|--------
Bristol                          | 0.07s  | 0.02s
Skye                             | 0.02s  | 0.01s
This commit is contained in:
Chris Hill-Scott
2021-07-05 15:54:06 +01:00
parent 08084dfbd2
commit e7ec77c5bb
2 changed files with 3 additions and 3 deletions

View File

@@ -171,7 +171,7 @@ class CustomBroadcastArea(BaseBroadcastArea):
@cached_property @cached_property
def count_of_phones(self): def count_of_phones(self):
return sum( return sum(
area.polygons.ratio_of_intersection_with(self.polygons) * area.count_of_phones area.simple_polygons.ratio_of_intersection_with(self.polygons) * area.count_of_phones
for area in self.overlapping_areas for area in self.overlapping_areas
) )

View File

@@ -377,7 +377,7 @@ def test_estimated_bleed(
'Stoke Bishop', 'Stoke Bishop',
'Windmill Hill', 'Windmill Hill',
], ],
73_496, 73_119,
), ),
( (
SKYE, SKYE,
@@ -387,7 +387,7 @@ def test_estimated_bleed(
'Na Hearadh agus Ceann a Deas nan Loch', 'Na Hearadh agus Ceann a Deas nan Loch',
'Wester Ross, Strathpeffer and Lochalsh', 'Wester Ross, Strathpeffer and Lochalsh',
], ],
3_517, 3_534,
), ),
)) ))
def test_count_of_phones_for_custom_area( def test_count_of_phones_for_custom_area(