Add polyline_to_points.py
parent
cfba2b500a
commit
e334ed888e
@ -0,0 +1,92 @@
|
|||||||
|
"""polyline_to_points.py
|
||||||
|
Extract interpolated points along transects in a shapefile.
|
||||||
|
|
||||||
|
D. Howe
|
||||||
|
d.howe@wrl.unsw.edu.au
|
||||||
|
2020-02-19
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
import numpy as np
|
||||||
|
import pandas as pd
|
||||||
|
import geopandas as gpd
|
||||||
|
from shapely.geometry import LineString
|
||||||
|
|
||||||
|
|
||||||
|
def extract(shp_path, spacing=1, field=None):
|
||||||
|
|
||||||
|
rows = []
|
||||||
|
shp = gpd.read_file(shp_path)
|
||||||
|
|
||||||
|
if field is None:
|
||||||
|
# Assume profile name is second field in shapefile
|
||||||
|
field = shp.columns[1]
|
||||||
|
|
||||||
|
for i, line in shp.iterrows():
|
||||||
|
g = line.geometry
|
||||||
|
chainages = np.arange(0, g.length, step=spacing)
|
||||||
|
for chainage in chainages:
|
||||||
|
easting, northing = g.interpolate(chainage).xy
|
||||||
|
|
||||||
|
row = {
|
||||||
|
'ProfileNum': line[field],
|
||||||
|
'Easting': easting[0],
|
||||||
|
'Northing': northing[0],
|
||||||
|
'Chainage': chainage,
|
||||||
|
}
|
||||||
|
rows.append(row)
|
||||||
|
|
||||||
|
# Create output dataframe
|
||||||
|
df = pd.DataFrame(rows)
|
||||||
|
|
||||||
|
# Re-order columns
|
||||||
|
df = df[['ProfileNum', 'Easting', 'Northing', 'Chainage']]
|
||||||
|
|
||||||
|
# Export to csv
|
||||||
|
csv_path = shp_path.replace('.shp', '.csv')
|
||||||
|
df.to_csv(csv_path, index=False)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
example_text = """examples:
|
||||||
|
# Extract points at default spacing (1m)
|
||||||
|
$ python polyline_to_points.py path/to/shp
|
||||||
|
|
||||||
|
# Extract points at 5m increments
|
||||||
|
$ python polyline_to_points.py -s 5 path/to/shp
|
||||||
|
|
||||||
|
# Extract points from field "ProfileID"
|
||||||
|
$ python polyline_to_points.py -f ProfileID path/to/shp
|
||||||
|
"""
|
||||||
|
# Set up command line arguments
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
epilog=example_text,
|
||||||
|
formatter_class=argparse.RawDescriptionHelpFormatter)
|
||||||
|
parser.add_argument('shp_path',
|
||||||
|
metavar='SHAPEFILE',
|
||||||
|
help='path to input shapefile')
|
||||||
|
parser.add_argument('-s',
|
||||||
|
'--spacing',
|
||||||
|
metavar='SPACING',
|
||||||
|
default=1,
|
||||||
|
type=int,
|
||||||
|
help='space between points (default=1)')
|
||||||
|
parser.add_argument('-f',
|
||||||
|
'--field',
|
||||||
|
metavar='FIELDNAME',
|
||||||
|
help='profile field name in attribute table')
|
||||||
|
|
||||||
|
# Print usage if no arguments are provided
|
||||||
|
if len(sys.argv) == 1:
|
||||||
|
parser.print_help(sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# Combine images
|
||||||
|
extract(**vars(args))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
Loading…
Reference in New Issue