Chọn tất cả các điểm trong một khung giới hạn


11

Tôi đã thấy câu hỏi này được hỏi trước đây, nhưng câu trả lời tôi đang cố gắng không hoạt động.

Tôi đang tìm cách truy vấn tất cả các cách OSM trong một khung giới hạn. Dữ liệu OSM được nhập với bộ tạo hình cầu mặc định. Tôi đang truy vấn bằng LAT / LON do đó biến đổi

SELECT *
FROM planet_osm_ways
WHERE ST_Transform(
  ST_MakeEnvelope(37.808264, 37.804339, -122.275244, -122.271189, 
  4326),3857
);

Khi tôi chạy này, tôi gặp lỗi sau:

LRI: đối số của WHERE phải là kiểu boolean, không phải kiểu hình học LINE 3: WHERE ST_Transform (ST_MakeEnvel (37.808264, 37.804339, -12 ...


1
Cung cấp một liên kết đến các câu hỏi cũ mà bạn đã đọc và sử dụng để xây dựng truy vấn của bạn.
dùng49584

Thứ tự phối hợp của bạn trong ST_MakeEn phong bì () không giống như chúng ở định dạng này, xmin, ymin, xmax, ymax
nghệ thuật21

@ tác phẩm nghệ thuật21 Tôi đang sử dụng lat / long trong ST_MakeEnvel. Là sai đó? Tôi có cần phải chuyển đổi nó sang một định dạng khác không? Tôi nghĩ đó là những gì ST_Transform đang làm
kể từ

1
Xin lỗi, tôi đã phải đọc các hướng dẫn tốt bao gồm cả tài liệu lược đồ một lần nữa wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways . Planet_osm_ways không chứa hình học và khá vô dụng đối với người dùng cuối. Nó là dành cho hệ thống. Không có cơ hội để thực hiện các truy vấn hộp giới hạn từ bảng đó. Với các bảng như hành tinh_osm_roads, điều đó là có thể. Still hành tinh_osm_roads.geom không tồn tại, vì như bạn thấy từ lược đồ, nó được đặt tên là hành tinh_osm_roads.way.
dùng49584

1
Không. Tôi đã nói rằng bạn không thể thực hiện truy vấn hộp giới hạn từ hành tinh_osm_ways vì bảng đó không có bất kỳ hình học nào. Xem: id, nút, thẻ, đang chờ xử lý - không ai trong số chúng chứa hình học. Bảng _line, _point, _polygon và _roads đều ổn. Và tôi đã cố gắng nhấn mạnh rằng cột hình học trong tất cả các bảng hình học được đặt tên là "cách", không phải là "geom" hay bất cứ thứ gì khác.
dùng49584

Câu trả lời:


14

Bạn có ba vấn đề với câu lệnh của mình mặc dù thông báo lỗi chỉ gợi ý một phần của nó ... "WHERE phải là kiểu boolean" có nghĩa là thông tin bạn đưa ra WHERE không được đánh giá cho kết quả boolean.

  1. ST_MakeEnvel yêu cầu các tham số của nó theo thứ tự này : xmin, ymin, xmax, ymax, srid.

    Bạn thông qua không chính xác ymax, ymin, xmax, xmin, srid.

  2. WHERE phải đánh giá để boolean:

    Để xác định xem hình học và đường bao có bất kỳ yếu tố chung nào không thì nên xây dựng WHERE như vậy: WHERE geom && envelope_geomnếu không, bạn có thể sử dụng ST_Contains

    Để xác định xem hình học có được chứa trong phong bì không: `WHERE ST_Contains (phong_geom, geom)

    Bạn đã không cung cấp bất kỳ phương pháp so sánh cho WHERE.

  3. Bảng 'hành tinh_osm_ways' không chứa bất kỳ cột hình học nào, mặc dù 'hành tinh_osm_roads' không chứa cột hình học có tên là 'cách'.

    Bạn có thể tạo một cột hình học trong bảng 'hành tinh_osm_ways' từ hành tinh liên quan_osm_nodes.lat và hành tinh_osm_nodes.lon.

Sử dụng 'hành tinh_osm_roads', điều này cho thấy cách sử dụng hộp giới hạn đối với bảng có cột hình học:

SELECT *
FROM planet_osm_roads
WHERE planet_osm_roads.way && ST_Transform(
  ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
  4326),3857
);

hoặc thay đổi nó thành này:

SELECT *
FROM planet_osm_roads
WHERE ST_Contains(
    ST_Transform(
        ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
        4326)
        ,3857)
    ,planet_osm_roads.way);
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.