QGIS操作:将多边形ID赋予重叠多边形
Hey there! Let's dig into why your "Join attributes by location" tool spit out all zeros, and get you a working solution—including an automated workflow you can reuse.
Your all-zero result almost certainly comes from misconfigured parameters, especially the geometric predicate and join type. Here's the correct step-by-step for QGIS:
- Load both Shapefile A (the one with your target IDs) and Shapefile B (the polygons you want to tag) into QGIS.
- Open the Join attributes by location tool—you can find it under
Vector > Data Management Toolsor search for it directly in the Processing Toolbox. - Configure these critical parameters:
- Target layer: Select Shapefile B (the layer you want to add IDs to)
- Join layer: Select Shapefile A (the layer with the source IDs)
- Geometric predicate: Choose Within (this tells QGIS to match B polygons that lie entirely inside A polygons; if partial overlaps count too, pick Intersects instead)
- Join settings:
- Join type: Pick Keep all target features and matching join features (a left join—this ensures every B polygon stays in the output, even if it doesn't overlap any A polygon)
- Merge rule: If a B polygon overlaps multiple A polygons (unlikely for your use case), pick Take first matching value (adjust if you need a different logic like max/min)
- Fields to join: Select the ID field from Shapefile A (e.g.,
ID)
- Run the tool. The output layer will have your A-layer ID attached to every B polygon that overlaps it; non-overlapping ones will show
NULL(not zero—your earlier zeros were likely a default field value from misconfigured matching).
If you need to run this task repeatedly or integrate it into a larger workflow, a PyQGIS script will automate the process entirely. Here's a ready-to-use script:
from qgis.core import ( QgsVectorLayer, QgsProcessingFeedback, QgsProcessingContext ) from qgis import processing # Update these paths and field names to match your data SHAPEFILE_A_PATH = "/your/path/to/ShapefileA.shp" SHAPEFILE_B_PATH = "/your/path/to/ShapefileB.shp" OUTPUT_PATH = "/your/path/to/TaggedShapefileB.shp" A_ID_FIELD_NAME = "ID" # Replace with your actual ID field name in Shapefile A # Load the input layers layer_a = QgsVectorLayer(SHAPEFILE_A_PATH, "ID_Source_Layer", "ogr") layer_b = QgsVectorLayer(SHAPEFILE_B_PATH, "Target_Layer", "ogr") # Validate layer loading if not layer_a.isValid() or not layer_b.isValid(): print("Error: Failed to load one or more shapefiles! Check your paths.") else: # Define processing parameters join_params = { "INPUT": layer_b, "JOIN": layer_a, "PREDICATE": [6], # 6 = "Within" predicate; use [0] for "Intersects" if needed "JOIN_FIELDS": [A_ID_FIELD_NAME], "METHOD": 1, # 1 = Left join (keep all target features) "DISCARD_NONMATCHING": False, "PREFIX": "A_", # Adds a prefix to the joined ID field to avoid conflicts "OUTPUT": OUTPUT_PATH } # Execute the join feedback = QgsProcessingFeedback() context = QgsProcessingContext() processing.run("qgis:joinattributesbylocation", join_params, feedback=feedback, context=context) print(f"Automated tagging complete! Output saved to: {OUTPUT_PATH}")
How to use this script:
- Replace the file paths and
A_ID_FIELD_NAMEwith your actual data details - Run it directly in QGIS's Python Console (
Plugins > Python Console) - For batch processing, wrap the core logic in a loop over a list of shapefile pairs
The all-zero outcome was probably due to:
Choosing the wrong geometric predicate (e.g., Contains instead of Within—which would look for A polygons inside B, not the other way around) OR selecting a join type that only kept matching features, with no matches found, leading to default zero values in the output field.
内容的提问来源于stack exchange,提问作者SnoruntIce

