Có một tùy chọn python để tham gia các thuộc tính theo khu vực khác không?


9

Tôi đang cố gắng thực hiện chức năng join attributes by locationnhư được tìm thấy trên menu QGIS Vector> Công cụ quản lý dữ liệu. Tôi đang tìm kiếm một tùy chọn python mã nguồn mở cho việc này. Tôi biết arcpy có một spatial joinchức năng nhưng tôi đang cố gắng thực hiện điều này bên ngoài môi trường ESRI.


1
Tôi sẽ đề nghị xem xét mã nguồn của Join attributes by locationlệnh thực tế từ fToolsplugin: doSpatialJoin.pyđặc biệt là compute()phương thức. Không nên quá khó để loại bỏ bất kỳ mã UI nào từ đó và loại bỏ nó thành một hàm python đơn giản.
Lukas Graf

Xin chào, tôi có một vấn đề khác một chút, tôi muốn kiểm tra xem có mối nối nào giữa hai lớp không! Tôi đang tìm kiếm một tùy chọn python mã nguồn mở cho việc này. Tôi muốn kiểm tra xem hàm s.join đã được sử dụng chưa và tôi đang cố gắng thực hiện điều này bên ngoài môi trường ESRI .. Ai có thể giúp tôi không!
Rania ben othmen

Câu trả lời:


8

Bạn có thể muốn xem ShapelyFiona . Fiona là một trình bao bọc cho gdal để làm cho việc nhập và xuất tệp không gian dễ dàng. Shapely cung cấp chức năng hình học. Dưới đây là một ví dụ rất đơn giản để cung cấp cho bạn ý tưởng. Nó tham gia các thuộc tính đa giác cho tất cả các điểm trong đa giác đó.

Dữ liệu ví dụ tôi đã sử dụng là những đa giácnhững điểm này .

import fiona
from shapely.geometry import shape
from copy import deepcopy

with fiona.open("planning_neighborhoods.shp", "r") as n: 

    with fiona.open("Schools_Private_Pt.shp", "r") as s:

        # create a schema for the attributes
        outSchema =  deepcopy(s.schema)
        outSchema['properties'].update(n.schema['properties'])

        with fiona.open ("Schools_withNbhd.shp", "w", s.driver, outSchema, s.crs) as output:

            for school in s: 
                for neighborhood in n:
                    # check if point is in polygon and set attribute
                    if shape(school['geometry']).within(shape(neighborhood['geometry'])):  
                        school['properties']['neighborho'] = neighborhood['properties']['neighborho'] 
                    # write out
                        output.write({                                 
                            'properties': school['properties'], 
                            'geometry': school['geometry']
                        })

Cảm ơn @cengel. Điều này có vẻ như nó sẽ đưa tôi đi đúng hướng! Tôi thực sự quan tâm đến việc nối với các đường và đa giác (cụ thể là tìm nơi các con sông giao nhau với các ô mô hình) và tôi nghĩ rằng nó sẽ hoạt động theo ví dụ của bạn.
mishaF

@cengel Các trạm qgis sử dụng plugin sử dụng các phương thức này có yêu cầu cài đặt mô-đun và gdal không?
user25976

@ user25976 xin lỗi, không chắc tôi khá hiểu câu hỏi của bạn. Ví dụ mã của tôi là một kịch bản python độc lập. Cả fiona và shapely đều yêu cầu gdal.
cengel

@cengel Xin lỗi, hãy để tôi làm rõ (Tôi mới lập trình). Về tập lệnh python độc lập: bạn có nghĩa là một plugin được viết bằng fiona và nhập khẩu có thể được sử dụng bởi người dùng QGIS ngay cả khi họ không cài đặt python hoặc các mô-đun trên máy tính của họ?
user25976

@ user25976 Họ cần các mô-đun được cài đặt trên máy tính của họ. Xem ví dụ ở đây
cengel

2

Mặc dù vẫn còn một chút khó khăn xung quanh các cạnh, đặc biệt là khi nói đến tài liệu và ví dụ, nhưng tương lai của geopandas có vẻ tươi sáng. Về cơ bản, nó kết hợp sức mạnh của các cơ sở dữ liệu gấu trúc với khả năng không gian địa lý của hình dạng.

chức năng bạn tìm kiếm được gọi là sjoin

Đảm bảo máy / thể hiện của bạn có đủ bộ nhớ để thực hiện thao tác

import geopandas as gpd
import pandas as pd
import os

gdfLeft = gpd.read_file(os.path.join(PATH,INPUT_FILE_NAME_1))
gdfRight = gpd.read_file(os.path.join(PATH,INPUT_FILE_NAME_2))

gdfJoined = gpd.sjoin(gdfLeft, gdfRight, how="left", op='intersects')

Đoạn mã này thực hiện phép nối không gian nhưng các thuộc tính của shapefile được nối là trống. Bất kỳ con trỏ?
tháng 4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.