- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用OSRM(OpenStreetMap路由机器)的实例来评估不同点之间的距离和时间。使用API,我可以检索想要和需要的信息,尤其是作为折线的真实路线。
直到今天,我都在起点和终点之间绘制了直线。
segments(
lon_patient,lat_patient,lon_lieu,lat_lieu,col = transp_time,lwd = 3
)
最佳答案
一种快速执行此操作的方法是从mapbox github存储库下载polyline.js文件,然后使用V8软件包为您完成艰苦的工作:
library(V8)
ctx <- new_context()
ctx$source("polyline.js")
ctx$call("polyline.decode", "_p~iF~ps|U_ulLnnqC_mqNvxq`@")
## [,1] [,2]
## [1,] 38.500 -120.200
## [2,] 40.700 -120.950
## [3,] 43.252 -126.453
require
,并结合了一些冗长的
0
分配):
DecodeLineR <- function(encoded) {
require(bitops)
require(stringr)
len = str_length(encoded)
encoded <- strsplit(encoded, NULL)[[1]]
index = 1
N <- 100000
df.index <- 1
array = matrix(nrow = N, ncol = 2)
lat <- dlat <- lng <- dlnt <- b <- shift <- result <- 0
while(index <= len) {
shift <- result <- 0
repeat {
b = as.integer(charToRaw(encoded[index])) - 63
index <- index + 1
result = bitOr(result, bitShiftL(bitAnd(b, 0x1f), shift))
shift = shift + 5
if(b < 0x20) break
}
dlat = ifelse(bitAnd(result, 1),
-(result - (bitShiftR(result, 1))),
bitShiftR(result, 1))
lat = lat + dlat;
shift <- result <- b <- 0
repeat {
b = as.integer(charToRaw(encoded[index])) - 63
index <- index + 1
result = bitOr(result, bitShiftL(bitAnd(b, 0x1f), shift))
shift = shift + 5
if(b < 0x20) break
}
dlng = ifelse(bitAnd(result, 1),
-(result - (bitShiftR(result, 1))),
bitShiftR(result, 1))
lng = lng + dlng
array[df.index,] <- c(lat = lat * 1e-05, lng = lng * 1e-5)
df.index <- df.index + 1
}
ret <- data.frame(array[1:df.index - 1,])
names(ret) <- c("lat", "lng")
return(ret)
}
DecodeLineR("_p~iF~ps|U_ulLnnqC_mqNvxq`@")
## lat lng
## 1 38.500 -120.200
## 2 40.700 -120.950
## 3 43.252 -126.453
decodeLine <- function(encoded){
require(bitops)
vlen <- nchar(encoded)
vindex <- 0
varray <- NULL
vlat <- 0
vlng <- 0
while(vindex < vlen){
vb <- NULL
vshift <- 0
vresult <- 0
repeat{
if(vindex + 1 <= vlen){
vindex <- vindex + 1
vb <- as.integer(charToRaw(substr(encoded, vindex, vindex))) - 63
}
vresult <- bitOr(vresult, bitShiftL(bitAnd(vb, 31), vshift))
vshift <- vshift + 5
if(vb < 32) break
}
dlat <- ifelse(
bitAnd(vresult, 1)
, -(bitShiftR(vresult, 1)+1)
, bitShiftR(vresult, 1)
)
vlat <- vlat + dlat
vshift <- 0
vresult <- 0
repeat{
if(vindex + 1 <= vlen) {
vindex <- vindex+1
vb <- as.integer(charToRaw(substr(encoded, vindex, vindex))) - 63
}
vresult <- bitOr(vresult, bitShiftL(bitAnd(vb, 31), vshift))
vshift <- vshift + 5
if(vb < 32) break
}
dlng <- ifelse(
bitAnd(vresult, 1)
, -(bitShiftR(vresult, 1)+1)
, bitShiftR(vresult, 1)
)
vlng <- vlng + dlng
varray <- rbind(varray, c(vlat * 1e-5, vlng * 1e-5))
}
coords <- data.frame(varray)
names(coords) <- c("lat", "lon")
coords
}
#include <Rcpp.h>
#include <vector>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
DataFrame decode_polyline(const std::string& encoded) {
size_t i = 0; // what byte are we looking at
constexpr double kPolylinePrecision = 1E6;
constexpr double kInvPolylinePrecision = 1.0 / kPolylinePrecision;
auto deserialize = [&encoded, &i](const int previous) {
int byte, shift = 0, result = 0;
do {
byte = static_cast<int>(encoded[i++]) - 63;
result |= (byte & 0x1f) << shift;
shift += 5;
} while (byte >= 0x20);
return previous + (result & 1 ? ~(result >> 1) : (result >> 1));
};
std::vector<double> lonv, latv;
int last_lon = 0, last_lat = 0;
while (i < encoded.length()) {
int lat = deserialize(last_lat);
int lon = deserialize(last_lon);
latv.emplace_back(static_cast<float>(static_cast<double>(lat) * kInvPolylinePrecision));
lonv.emplace_back(static_cast<float>(static_cast<double>(lon) * kInvPolylinePrecision));
last_lon = lon;
last_lat = lat;
}
return DataFrame::create(_["lon"] = lonv, _["lat"] = latv);
}
polyline.cpp
中,只需:
Rcpp::sourceCpp("polyline.cpp")
decode_polyline("_p~iF~ps|U_ulLnnqC_mqNvxq`@")
## lon lat
## 1 -120.200 38.500
## 2 -120.950 40.700
#3 3 -126.453 43.252
DecodeLineR
的最大值都非常“在那里”。
decodeLine()
纯R版本似乎足够性能,不能保证不引起
V8
或
Rcpp
/C++ 11依赖性,而是YMMV。
googleway::decode_pl()
函数合并到新的基准测试中,并使用了更长的折线。基准代码在下面,而新图则在下面。
library(microbenchmark)
library(Rcpp)
library(inline)
library(V8)
library(googleway)
library(ggplot2)
sourceCpp("polyline.cpp")
ctx <- v8()
ctx$source("polyline.js")
source("DecodeLineR.R")
source("decodeline.R")
line_str <- "{ae{HntiQtCcDzG_I|^uc@rFgHhC{CxAiA~AaA~BkAvB}A|F_G|AgBbBkCtAwCd@sA|BoIVw@Pc@|@gBt@}@|@y@lCwBvA_B`@k@~@aBt@iBlAaE~@oEp@sDX{BP_BJaDAcEIeCe@gHo@yMUaEk@uDm@iD]mCAwBNsDXyDL}@nByIZyCt@cLr@gNB_ABoEAkFJmDTkBVeAZ_Af@gAnDwF|@gBbAoChHgUPWlAT`@B|@GbE_@dAW`Cu@vBe@tDs@xD{@`Bg@bBq@hBaAtB}@dCi@bF}@jBg@pBeAj@SNE\\C^@\\DbAZ`Ah@~C`A\\H|ALzAFLA^Gl@UdBgAjBaBZSh@Qz@MjD_@`FoAtCa@j@Ez@DxE|@xF\\nBP~@TxHvBf@Tb@\\pBvC\\^`@XxAf@fBT|BDfAIr@MfBe@rBa@rBMvBYxBg@xA_@^Ir@@NF|@l@nBfAjAj@dBV`Bb@lBbAbB~ALPhC`FV`@n@z@^VNBX?LGZa@d@eAp@qAt@Sx@Cz@G\\IZOhCcBb@c@T]jA_CrE_HfEiFz@}@p@k@|@o@`C{A`A{@rBwBx@oAbByCp@wArAoDLWxA}BhAcBjAqAlAiB~AaDr@sBp@{CD[TkC^}FZyD^oCx@gF`@qAh@kAz@yAtAgBpD_E|JoKdDuEjBcCfC{ExCqGdAgBlBuBrAyBpEkIpEsI\\]^YbAg@|GaBzKeEfBe@lCW`AQr@U|A_AtAkAhDyCpAeA|Aq@`EeCrDgBvA{@tD}C`BmAzBm@t@QvAQxBOl@Q~Ai@~BsAlCcB"
microbenchmark(
googleway = decode_pl(line_str),
rcpp = decode(line_str),
js = ctx$call("polyline_decode", line_str),
DecodeLineR = DecodeLineR(line_str),
decodeLine = decodeLine(line_str),
control=list(warmup=50),
times=1000
) -> mb
mb
## Unit: microseconds
## expr min lq mean median uq max neval cld
## googleway 404.322 471.8475 817.8312 526.270 579.095 135564.973 1000 a
## rcpp 253.062 302.9550 363.9325 359.765 401.054 831.699 1000 a
## js 2793.677 3099.3390 3359.6190 3219.312 3427.636 15580.609 1000 b
## DecodeLineR 9366.714 9656.4140 12029.3991 10128.676 12570.216 181536.940 1000 c
## decodeLine 9907.869 10218.0465 11413.5732 10655.949 11491.305 150588.501 1000 c
update_geom_defaults("violin", list(fill="maroon"))
autoplot(mb) +
scale_y_log10(name="Time [microseconds]", label=scales::comma) +
hrbrmisc::theme_hrbrmstr(grid="X")
关于r - 如何从OSRM解码编码的折线并绘制路线几何图形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32476218/
What is the difference between OSRM route service and match service? 最佳答案 根据 OSRM documentation , ro
如标题中所述:如何使用匹配调用? 我试过 http://router.project-osrm.org/match/v1/driving/8.610048,46.99917;8.530232,47.0
我正在努力在我的 ubuntu 12.04 服务器上安装 OSRM。在 osrm-routed map.osrm 我收到以下错误: [info] starting up engines, v4.8.1
ORSM 有 3 种配置文件,适用于不同的交通方式:自行车、步行和汽车。这些随 OSRM 一起提供。 根据 1 年前发表的以下帖子,OSRM 不支持多个配置文件: OSM routing (OSRM)
在版本 v4 下,我使用 http://router.project-osrm.org/viaroute?loc=47.168,8.117&loc=46.978,8.335&instructions=
我正在尝试使用 Docker 设置 OSRM 后端服务器。主机是运行 OS 10.14 (Mojave) 的具有 32GB RAM 的 MacBook Pro。 下载 england-latest.o
它this Mapbox blog post , Lauren Budorick分享他们如何与 OSRM 一起使用路线引擎,该引擎使用海拔数据为骑车人提供更好的路线......太棒了! 我还想在插入外
我正在开发一个基于 OSRM 的应用程序,该应用程序从地址列表开始提供以公里和分钟为单位的距离。 我正在使用请求“viaroute”来取回所需的信息。这是一个请求示例: http://router.p
这不完全是一个编程问题,因为我在第一步就被击落了。 我正在尝试获取丹佛和新泽西之间的最短路径并使用 URL: http://router.project-osrm.org/route/v1/drive
我有一个关于 OSRM 项目中双线性插值的问题。我了解“正常”双线性插值。这是来自维基百科的图片,什么是疯狂的: 现在我正在尝试了解 OSRM 项目中用于栅格源数据的双线性插值。 // Query r
我一直在研究 OSRM最近的路由库。它似乎在解决最短路径问题方面非常有效。但是,我没有看到如何用它计算单源最短路径。更准确地说,给定一个固定的起点,计算在给定距离限制内可以到达的所有位置的最短距离(例
我在 Ubuntu 14.04 上使用 npm install osrm 安装了 node osrm。这已经安装了 OSRM v4.9。下一步是设置 OSRM。我正在尝试按照 wiki 中给出的步骤进
我正在尝试在我自己的 map 数据上使用 OSRM(以 OSM 格式) 我想知道大约 66k 的 OSM 属性中有哪些与此相关,而哪些被 OSRM 忽略了。 有没有人可以指点我的引用资料? 最佳答案
OSRM ( http://project-osrm.org/ ) 中是否有一个 URL,我可以在 JAVA 程序中调用它并解析返回的 Json 文件,例如: https://maps.googlea
我已经使用 cloudmade API 在我的网站上成功实现了路由系统。我也想对 OSRM 路由系统 ( https://github.com/DennisOSRM/Project-OSRM ) 执行
我正在尝试通过 projects-osrm 获取两个地理位置之间的距离。通过 python。 import requests source_coordinates = '18.21231,42.508
我正在安装 OSRM 以在 Ubuntu 14.04 Droplet 上工作。我正在关注 https://www.digitalocean.com/community/tutorials/how-to
语境 :我正在查询 OSRM 以返回两个坐标之间的路线。它返回我请求的路线以及部分(步骤)以及路线说明(v5 中的 RouteStep 对象数组)。 http://project-osrm.org/d
我正在尝试使用“osrm”包在 R 中计算更多距离。我不知道我做错了什么,因为我遵循了包中的所有步骤。当我尝试使用参数 max-table-size 时,它返回错误。 我已经尝试将参数 max-tab
我一直在尝试使用具有以下请求的 OSRM 获取从 A 点到 B 点的 route 的坐标列表: 获取 http://router.project-osrm.org/viaroute?hl=en&loc
我是一名优秀的程序员,十分优秀!