Tinh chỉnh câu trả lời hay của Pablo, với các định nghĩa (bên dưới) và thêm danh sách kiểm tra cho từng phương pháp, hạn chế việc sử dụng chúng. Định nghĩa:
Lớp khối là một bảng SQL với các đa giác đại diện cho các ranh giới khối thành phố , có hoặc không có vỉa hè , nhưng vẫn giữ các đường riêng (xem mặt trước 1 ) hoặc các đường không có địa chỉ (xem mặt trước 2 ) vào khối.
Lớp lô là một bảng SQL với các đa giác thể hiện ranh giới lô đất .
Lớp đường là một bảng SQL với các đường biểu thị các đường phố ... Hoặc, trong một "vùng đất sông" cũng là các con sông (và đường sắt có thể là "mặt trận"?).
Mặt trước 1 : Các phương pháp của @ Pablo là về một khái niệm chung về mặt trước , trong đó một số lô có nhiều hơn "một mặt trước về một đường", bởi vì nằm ở góc (có hai hoặc nhiều đoạn trước về tất cả các đường xung quanh).
Mặt trước-2 : "mặt trước" là về đường được chỉ định trong địa chỉ chính thức (hoặc địa chỉ thư tín) của lô. Họ, tất cả các lô (thậm chí ở góc) chỉ có một đoạn đường phía trước. Tái bút: nếu hệ thống địa chỉ và lớp khối của bạn chấp nhận nhiều " condominuim ngang " và địa chỉ chung cư của nó, "đường riêng" phải hiển thị như các đường thông thường .
Minh họa câu hỏi của @ ChristianAbreu cho thấy khái niệm Front-2 (!) , Chứ không phải là khái niệm chung.
Lưu ý kỹ thuật: bạn có thể cắm Python với PostGIS hoặc với bất kỳ công cụ tương thích OGC nào khác (đối với SQL không gian) để thể hiện chính thức danh sách kiểm tra.
Danh sách kiểm tra cho phương thức # 1 - bên của đa giác không chạm vào bất kỳ đa giác nào khác
Phương pháp này có cách tiếp cận cấu trúc liên kết, chỉ có giá trị đối với các khối nơi tất cả các khu vực của lô tạo thành khu vực của khối. Vì vậy, để sử dụng phương pháp này, bạn cần có lớp khối .
Thể hiện rõ ràng: kiểm tra nếu blkarea~=sum_lotarea
cho mỗi khối,
SELECT ST_Area(geom) INTO blkarea FROM block WHERE gid=each1;
SELECT SUM(ST_Area(geom)) INTO sum_lotarea FROM lot WHERE gid_block=each1;
Hoặc, nếu các giá trị không chính xác hoặc nếu các khối có vỉa hè, hãy sử dụng ít nhất w để ST_Buffer(block.geom,-w)
đảm bảo ST_Within(lot.geom lot,ST_Buffer(block.geom,-w))
cho tất cả các lô.
LƯU Ý: kiểm tra cũng
nếu tất cả các lô nằm trong một khối, ST_Within(lot.geom,block.geom)
cho tất cả các lô và các khối liên quan.
nếu, đối với tất cả các lô không tách rời, không có khu vực chồng chéo. not(ST_Overlaps(a,b))
hoặc khu vực giao lộ này không có ý nghĩa (đó là 2*ST_Area(ST_Intersection(a,b))/(ST_Area(a)+ST_Area(b))<0.01
).
Danh sách kiểm tra cho phương pháp # 2 - cạnh của đa giác gần nhất với đường
Phương pháp này có một cách tiếp cận hình học, dựa trên khoảng cách euclide tối thiểu .
Kiểm tra xem lớp đường chỉ có "đường công cộng" hay không , bởi vì bạn phải tách "đường công cộng" (có thể thể hiện địa chỉ chính thức của lô đất) khỏi "đường hẻm" (có thể là nội bộ của lô hoặc "khối chung cư" ").
Sau đó, kiểm tra trực quan, nếu tất cả các "khối trực quan" được bao quanh bởi các đường phố. Nếu lớp đường phố của bạn không đầy đủ, phương thức không hợp lệ cho các khối đó.
Kết luận: quy tắc chọn phương pháp
Đối với định nghĩa Front-1 :
A) Khi bạn có dữ liệu đường phố tốt, hãy sử dụng phương pháp # 2 ;
B) Khi bạn có lớp khối và lớp lô nhất quán, hãy sử dụng phương pháp # 1
C) Khi bạn không có dữ liệu tốt, hãy thử chia dữ liệu không gian của bạn thành các phần mà bạn có thể sử dụng một hoặc một phương pháp khác. PS: ngay cả khi không có lớp khối, bạn có thể xây dựng các lô lân cận hoặc bằng một câu trả lời hay cho câu hỏi này .
Đối với định nghĩa Front-2 : bạn cần dữ liệu đường phố tốt, vì định nghĩa Front-2 cần tên đường phố (của địa chỉ lô). Sử dụng phương pháp # 2 và thả các phân đoạn phía trước không có cùng tên đường phố so với địa chỉ lô.