pyhld/qgis_scripts/centerlines_from_homes.py

77 lines
2.3 KiB
Python
Raw Normal View History

2024-04-19 19:29:59 +00:00
import osmnx as ox
import geopandas as gpd
from shapely import wkt
from shapely.geometry import Point
from qgis.core import QgsProject, QgsVectorLayer, QgsFeature, QgsGeometry, QgsWkbTypes, QgsField
print("Getting road centerlines...")
# Get the HOME_POINTS layer
home_points_layer = QgsProject.instance().mapLayersByName('HOME_POINTS')[0]
# Check if there's at least one feature in the layer
if home_points_layer.featureCount() > 0:
# Generate a buffer around each point
buffer_distance = 0.01 # change to your desired buffer distance
buffers = []
for feature in home_points_layer.getFeatures():
point = wkt.loads(feature.geometry().asWkt())
buffer_polygon = point.buffer(buffer_distance)
buffers.append(buffer_polygon)
# Combine all buffers into a single polygon
union_polygon = gpd.GeoSeries(buffers).unary_union
# Create PROJECTAREA layer in memory
project_area_layer = QgsVectorLayer("Polygon?crs=epsg:4326", "PROJECTAREA", "memory")
pr = project_area_layer.dataProvider()
# Start editing the layer
project_area_layer.startEditing()
# Create new feature for the layer
f = QgsFeature()
f.setGeometry(QgsGeometry.fromWkt(union_polygon.wkt))
pr.addFeature(f)
# Commit changes
project_area_layer.commitChanges()
# Add the layer to the Layers panel in QGIS
project_area_layer.setOpacity(0.3)
QgsProject.instance().addMapLayer(project_area_layer)
# Use OSMnx to download the street network
G = ox.graph_from_polygon(union_polygon, network_type='drive')
# Convert the graph into GeoDataFrames
gdf_nodes, gdf_edges = ox.graph_to_gdfs(G)
# Convert gdf_edges (GeoDataFrame) to WKT format for QGIS
wkt_list = gdf_edges['geometry'].to_wkt().tolist()
# Create a new layer for the street centerlines
vl = QgsVectorLayer("LineString?crs=epsg:4326", "CENTERLINES", "memory")
# Start editing the layer
vl.startEditing()
# Get the data provider
pr = vl.dataProvider()
# Create new features for the layer
for wkt in wkt_list:
f = QgsFeature()
f.setGeometry(QgsGeometry.fromWkt(wkt))
pr.addFeature(f)
# Commit changes
vl.commitChanges()
# Add the layer to the Layers panel in QGIS
QgsProject.instance().addMapLayer(vl)
else:
print("No points found in the HOME_POINTS layer.")
print("Done.")