mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-21 07:51:13 -05:00
Pass polygons through if they’re small already
If a polygon is smaller than the largest polygon in our dataset of simplified polygons then we’re only throwing away useful detail by simplifying it. We should still simplify larger polygons as a fallback, to avoid sending anything to the CBC that we’re not sure it will like. The thresholds here are low: we can raise them as we test and experiment more. Here’s some data about the Flood Warning Service polygons Percentile | 80% | 90% | 95% | 98% | 99% | 99.9% -----------|-----|-------|--------|---------|---------|--------- Point count| 226 | 401.9 | 640.45 | 1015.38 | 1389.07 | 3008.609 Percentile | 80% | 90% | 95% | 98% | 99% | 99.9% --------------|-----|-------|--------|---------|---------|--------- Polygon count |2----|3------|5-------|8--------|10-------|40.469
This commit is contained in:
@@ -28,5 +28,5 @@ def cap_xml_polygon_to_list(polygon_string):
|
|||||||
[
|
[
|
||||||
float(coordinate) for coordinate in pair.split(',')
|
float(coordinate) for coordinate in pair.split(',')
|
||||||
]
|
]
|
||||||
for pair in polygon_string.split(' ')
|
for pair in polygon_string.strip().split(' ')
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -65,6 +65,11 @@ def create_broadcast():
|
|||||||
status_code=400,
|
status_code=400,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if len(polygons) > 12 or polygons.point_count > 250:
|
||||||
|
simple_polygons = polygons.smooth.simplify
|
||||||
|
else:
|
||||||
|
simple_polygons = polygons
|
||||||
|
|
||||||
broadcast_message = BroadcastMessage(
|
broadcast_message = BroadcastMessage(
|
||||||
service_id=authenticated_service.id,
|
service_id=authenticated_service.id,
|
||||||
content=broadcast_json['content'],
|
content=broadcast_json['content'],
|
||||||
@@ -73,7 +78,7 @@ def create_broadcast():
|
|||||||
'areas': [
|
'areas': [
|
||||||
area['name'] for area in broadcast_json['areas']
|
area['name'] for area in broadcast_json['areas']
|
||||||
],
|
],
|
||||||
'simple_polygons': polygons.smooth.simplify.as_coordinate_pairs_lat_long,
|
'simple_polygons': simple_polygons.as_coordinate_pairs_lat_long,
|
||||||
},
|
},
|
||||||
status=BroadcastStatusType.PENDING_APPROVAL,
|
status=BroadcastStatusType.PENDING_APPROVAL,
|
||||||
api_key_id=api_user.id,
|
api_key_id=api_user.id,
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -103,9 +103,9 @@ def test_valid_post_cap_xml_broadcast_returns_201(
|
|||||||
assert response_json['personalisation'] is None
|
assert response_json['personalisation'] is None
|
||||||
assert response_json['service_id'] == str(sample_broadcast_service.id)
|
assert response_json['service_id'] == str(sample_broadcast_service.id)
|
||||||
assert len(response_json['simple_polygons']) == 1
|
assert len(response_json['simple_polygons']) == 1
|
||||||
assert len(response_json['simple_polygons'][0]) == 27
|
assert len(response_json['simple_polygons'][0]) == 29
|
||||||
assert response_json['simple_polygons'][0][0] == [53.10635, 0.240159]
|
assert response_json['simple_polygons'][0][0] == [53.10569, 0.24453]
|
||||||
assert response_json['simple_polygons'][0][-1] == [53.10635, 0.240159]
|
assert response_json['simple_polygons'][0][-1] == [53.10569, 0.24453]
|
||||||
assert response_json['starts_at'] is None
|
assert response_json['starts_at'] is None
|
||||||
assert response_json['status'] == 'pending-approval'
|
assert response_json['status'] == 'pending-approval'
|
||||||
assert response_json['template_id'] is None
|
assert response_json['template_id'] is None
|
||||||
@@ -114,6 +114,27 @@ def test_valid_post_cap_xml_broadcast_returns_201(
|
|||||||
assert response_json['updated_at'] is None
|
assert response_json['updated_at'] is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_large_polygon_is_simplified(
|
||||||
|
client,
|
||||||
|
sample_broadcast_service,
|
||||||
|
):
|
||||||
|
auth_header = create_service_authorization_header(service_id=sample_broadcast_service.id)
|
||||||
|
response = client.post(
|
||||||
|
path='/v2/broadcast',
|
||||||
|
data=sample_cap_xml_documents.WINDEMERE,
|
||||||
|
headers=[('Content-Type', 'application/cap+xml'), auth_header],
|
||||||
|
)
|
||||||
|
assert response.status_code == 201
|
||||||
|
|
||||||
|
response_json = json.loads(response.get_data(as_text=True))
|
||||||
|
|
||||||
|
assert len(response_json['simple_polygons']) == 1
|
||||||
|
assert len(response_json['simple_polygons'][0]) == 110
|
||||||
|
|
||||||
|
assert response_json['simple_polygons'][0][0] == [54.419546, -2.988521]
|
||||||
|
assert response_json['simple_polygons'][0][-1] == [54.419546, -2.988521]
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("training_mode_service", [True, False])
|
@pytest.mark.parametrize("training_mode_service", [True, False])
|
||||||
def test_valid_post_cap_xml_broadcast_sets_stubbed_to_true_for_training_mode_services(
|
def test_valid_post_cap_xml_broadcast_sets_stubbed_to_true_for_training_mode_services(
|
||||||
client,
|
client,
|
||||||
|
|||||||
Reference in New Issue
Block a user