Find reconstructed features overlapping a polygon
This example iterates over a collection of reconstructed features and finds those whose geometry overlaps a polygon.
Sample code
import pygplates
# Load one or more rotation files into a rotation model.
rotation_model = pygplates.RotationModel('rotations.rot')
# Load some features.
features = pygplates.FeatureCollection('features.gpml')
# Reconstruct features to 10Ma.
reconstruction_time = 10
# All features have their geometries tested for overlap with this polygon.
# The polygon is created using a sequence of (latitude, longitude) points.
polygon = pygplates.PolygonOnSphere([(0,0), (90,0), (0,90)])
# Reconstruct the features to 10Ma.
reconstructed_features = []
pygplates.reconstruct(features, rotation_model, reconstructed_features, reconstruction_time, group_with_feature=True)
# The list of features that overlap the polygon when reconstructed to 10Ma.
overlapping_features = []
# Iterate over all reconstructed features.
for feature, feature_reconstructed_geometries in reconstructed_features:
# Iterate over all reconstructed geometries of the current feature.
for feature_reconstructed_geometry in feature_reconstructed_geometries:
# Get the minimum distance from polygon to the current reconstructed geometry.
# We treat the polygon as solid so anything inside it has a distance of zero.
# We also treat the reconstructed geometry as solid (in case it's also a polygon).
min_distance_to_feature = pygplates.GeometryOnSphere.distance(
polygon,
feature_reconstructed_geometry.get_reconstructed_geometry(),
geometry1_is_solid=True,
geometry2_is_solid=True)
# A minimum distance of zero means the current reconstructed geometry either
# intersects the polygon's boundary or is inside it (or both).
if min_distance_to_feature == 0:
overlapping_features.append(feature)
# We've finished with the current feature (don't want to add it more than once).
break
# If there are any overlapping features then write them to a file.
if overlapping_features:
# Put the overlapping features in a feature collection so we can write them to a file.
overlapping_feature_collection = pygplates.FeatureCollection(overlapping_features)
# Create a filename (for overlapping features) with the reconstruction time in it.
overlapping_features_filename = 'features_overlapping_at_{0}Ma.gpml'.format(reconstruction_time)
# Write the overlapping features to a new file.
overlapping_feature_collection.write(overlapping_features_filename)
Details
The rotations are loaded from a rotation file into a pygplates.RotationModel
.
rotation_model = pygplates.RotationModel('rotations.rot')
The reconstructable features are loaded into a pygplates.FeatureCollection
.
features = pygplates.FeatureCollection('features.gpml')
The features are reconstructed to their 10Ma positions.
reconstruction_time = 10
The test polygon will capture all features whose reconstructed geometry(s) overlap it.
polygon = pygplates.PolygonOnSphere([(0,0), (90,0), (0,90)])
All features are reconstructed to 10Ma using
pygplates.reconstruct()
.We specify a
list
for reconstructed_features instead of a filename.We also set the output parameter group_with_feature to
True
(it defaults to False
)
so that our reconstructed feature geometries
are grouped with their feature
.reconstructed_features = []
pygplates.reconstruct(features, rotation_model, reconstructed_features, reconstruction_time, group_with_feature=True)
Each item in the reconstructed_features list is a tuple containing a feature and its associated reconstructed geometries.
for feature, feature_reconstructed_geometries in reconstructed_features:
A feature can have more than one geometry and hence will have more than one reconstructed geometry.
for feature_reconstructed_geometry in feature_reconstructed_geometries:
Calculate the minimum distance between the polygon and a reconstructed feature geometry using
pygplates.GeometryOnSphere.distance()
.geometry1_is_solid is set to True in case the reconstructed geometry lies entirely inside
the polygon in which case it will return a distance of zero.
If we did not specify this it would have returned the distance to the polygon’s boundary outline
which could be non-zero if the reconstructed geometry did not intersect the outline.
And geometry2_is_solid is set to True in case the polygon lies entirely inside the reconstructed
geometry (if it’s a polygon also). This also constitutes an overlap.
min_distance_to_feature = pygplates.GeometryOnSphere.distance(
polygon,
feature_reconstructed_geometry.get_reconstructed_geometry(),
geometry1_is_solid=True,
geometry2_is_solid=True)
A minimum distance of zero means the current reconstructed geometry either intersects the polygon’s
boundary or is inside it.
Or, conversely, the polygon could be inside the reconstructed geometry (if it’s a polygon) which also constitutes an overlap.
if min_distance_to_feature == 0:
overlapping_features.append(feature)
break
Finally we write the overlapping features to a file.
We could then load them into GPlates, reconstruct to 10Ma and check the results.
overlapping_feature_collection = pygplates.FeatureCollection(overlapping_features)
overlapping_features_filename = 'features_overlapping_at_{0}Ma.gpml'.format(reconstruction_time)
overlapping_feature_collection.write(overlapping_features_filename)