Làm cách nào tôi có thể sử dụng đường từ dữ liệu OSM trong R?


8

Tôi cần sử dụng các con đường để so sánh các vị trí GPS để xác minh rằng chúng không có lỗi trong dữ liệu.

Tôi đã tải xuống map.osm từ một trang web có thông tin về Thành phố Rome và nó đã được chuyển đổi thành Spatial Lines ở R.

src <- osmsource_file(file = "rome.osm")
bb <- center_bbox(41.9, 12.3, 1000, 1000)
rome <- get_osm(bb, src)
ways <- find(rome, way(tags(k == "highway")))
ways <- find_down(rome, way(ways))
ways <- subset(rome, ids = ways)
hw_lines <- as_sp(ways, "lines")  

Vì vậy, với Đối tượng Đường không gian, tôi đã cố gắng sử dụng chức năng distm nhưng bị cáo buộc rằng đối tượng không gian không thể được sử dụng (không phải ở định dạng phù hợp).

Có một cách khác sử dụng OSM để lấy thông tin chỉ những con đường mà tôi có thể so sánh với dữ liệu GPS trong R?


1
Là gì distmchức năng? Bạn có thể hiển thị những gì bạn đã cố gắng và thông báo lỗi? Bạn đang cố gắng tính khoảng cách từ một số điểm đến điểm gần nhất trên mạng đường bộ?
Spacesman

distmlà một hàm từ không gian địa lý gói trong R, nó tính toán khoảng cách điểm betweeen đến điểm hoặc điểm đến Đối tượng không gian, trả về một ma trận trong trường hợp thứ hai. `a <- distm (c (taxi $ lat [1], taxi $ lon [1]), hw_lines, fun = distHaversine)` Lỗi nói "Lỗi trong .pointToMatrix (y): các điểm phải là vectơ có độ dài 2, ma trận có 2 cột hoặc kế thừa từ một đối tượng SpatialPoints * ". as_sptừ gói osmar chuyển đổi đối tượng OSM được tải sang Đối tượng không gian. > class(hw_lines) [1] "SpatialLinesDataFrame" attr(,"package") [1] "sp"
Fabio Jojima

Câu trả lời:


7

Tôi đã tải xuống một bộ dữ liệu từ Thành phố Rome bằng cách sử dụng osmargói. Sau đó, tôi đã theo dõi truy vấn của bạn để có được các đường cao tốc mong muốn và sau đó xây dựng một đối tượng SpatialPoints ngẫu nhiên bên trong hộp giới hạn lấy dữ liệu ở Rome. Tôi đo khoảng cách giữa các điểm và đường bằng cách sử dụng hàm dist2linetừ geospheregói.

Vui lòng thử mã dưới đây:

# Load libraries
library('osmar')
library('geosphere')

# Define the spatial extend of the OSM data we want to retrieve
rome.box <- center_bbox(center_lon = 12.5450, center_lat = 41.8992, width =  2000, height = 2000)

# Download all osm data inside this area
api <- osmsource_api()
rome <- get_osm(rome.box, source = api)

# General plot
plot(rome)

# Find highways
ways <- find(rome, way(tags(k == "highway")))
ways <- find_down(rome, way(ways))
ways <- subset(rome, ids = ways)

# SpatialLinesDataFrame object
hw_lines <- as_sp(ways, "lines")  

# Plot
spplot(hw_lines, zcol = "uid")

# Interactive view
mapview::mapview(hw_lines) 

# Make a random points dataset (like GPS)
gpsPoints <- spsample(x = hw_lines, n = 100, type = "random")

# Plot points
plot(hw_lines, xlab = "Lon", ylab = "Lat")
plot(gpsPoints, add = TRUE, pch = 19, col = "red")
box()

# Distances between Higways and random points
distances <- dist2Line(p = gpsPoints, line = hw_lines)

đường cao tốc


Tôi đã cố gắng sử dụng api <- osmsource_api()nhưng họ nói rằng bbox có quá nhiều điểm nên tôi đã cố tải xuống tệp .osm. Tôi đã sử dụng rome.osm từ http://metro.teczno.com/#rome . Tôi không hiểu, trong https://en.wikipedia.org/wiki/Rome nói rằng tọa độ Rome là 41 ° 54′N 12 ° 30′E và trong OSM Rome nói rằng đó là 41 ° 889'N 12 ° 48 ' E, nhưng bạn đã sử dụng một tọa độ khác cho rome.box của bạn. get_osm()có một tọa độ khác nhau sistem?
Fabio Jojima

@FabioJojima Tôi xin lỗi, đó là một lỗi! Tôi tìm thấy "Rome" là một thành phố ở Mỹ! Tôi cập nhật câu trả lời. Vui lòng kiểm tra nếu bây giờ trả lời câu hỏi của bạn!
Guzmán

1
Tôi thấy rằng cuộc gọi tùy chọn mapviewkhông hoạt động vì các thói quen Rcpp của chúng tôi không hỗ trợ các đối tượng 'POSIX *'. Dù sao, vấn đề đã được giải quyết ngay bây giờ trên nhánh phát triển GitHub và sẽ có sẵn với bản cập nhật chính thức tiếp theo trên CRAN.
fdetsch

1
Tôi nhận được một lỗi thực thi get_osm(rome.box, source = api)nói Space required after the Public Identifier. Có một câu trả lời ở đây liên kết về cách sửa chữa nó.
Jesper Hybel
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.