我正在使用sp::SpatialLines
构建spsample
。在文档中,它是为spsample(x, n, type, ...)
编写的:
type:字符; “随机”表示完全空间随机; “常规”用于常规(系统对齐)采样; [...]
但是,我刚刚意识到,在相同的两点之间用spsample
和type='regular'
连续创建的线不是相同的:
library(sp)
set.seed(12)
for (i in 1:10) {
p1 = c(400000, 401000)
p2 = c(5600000, 5601000)
l1 = as.data.frame(spsample(SpatialLines(list(Lines(Line(cbind(p1, p2)), ID="a"))),
10000, "regular"))
l2 = as.data.frame(spsample(SpatialLines(list(Lines(Line(cbind(p1, p2)), ID="a"))),
10000, "regular"))
print(all.equal(l1, l2))
}
# [1] "Component “p1”: Mean relative difference: 1.8687e-07"
# [1] "Component “p1”: Mean relative difference: 1.680998e-07"
# [1] "Component “p1”: Mean relative difference: 3.382085e-08"
# [1] "Component “p1”: Mean relative difference: 1.155756e-07"
# [1] TRUE
# [1] "Component “p1”: Mean relative difference: 1.051644e-07"
# [1] TRUE
# [1] "Component “p1”: Mean relative difference: 4.354955e-08"
# [1] "Component “p1”: Mean relative difference: 2.074916e-08"
# [1] "Component “p1”: Mean relative difference: 1.380726e-07"
我一直在代码中奋力拼搏,以了解为什么测量(应该是)两个相同点和(应该是)两条相同线之间的距离并不能得出严格相同的结果。
有人知道为什么会这样,以及如何确保连续运行之间的结果一致吗? (或:是否有其他选择可以像上面一样建立两条相同的线?)
答案 0 :(得分:2)
这是一些奇怪的行为。虽然,如果将种子放在两个样本之前,则不会有任何差异。因此,这可能是由于常规采样的来源在不同运行中略有不同。
void onMapCreated(GoogleMapController controller) {
setState(() {
mapController = controller;
for (int i = 0; i < list.length; i++) {
var corte = list[0].keys.elementAt(i).split('/');
mapController.addMarker(MarkerOptions(
position: LatLng(list[0].values.elementAt(i).latitude, list[0].values.elementAt(i).longitude),
icon: BitmapDescriptor.defaultMarkerWithHue(
corte[1] == "tipo:0"
? BitmapDescriptor.hueRed
: corte[1] == "tipo:4"
? BitmapDescriptor.hueBlue
: corte[1] == "tipo:3"
? BitmapDescriptor.hueGreen
: corte[1] == "tipo:2"
? BitmapDescriptor.hueYellow
: null),
infoWindowText: InfoWindowText(corte[0], 'Ver'))).then((marker){
marker.id=corte[2];
});
mapController.onInfoWindowTapped.add((marker) {
print(marker.id);
Navigator.push(
context,
new MaterialPageRoute(
builder: (context) => corte[1] == "tipo:0"
? new MeterDetailsChartPage(
elemento: metersDetails[int.parse(marker.id)],
estate: this.estate,
parcela: widget.parcela)
: corte[1] == "tipo:4"
? new ValvePage(
elemento: valvesDetails[int.parse(marker.id)],
estate: this.estate,
parcela: widget.parcela)
: corte[1] == "tipo:3"
? new RelePage(
elemento: relesDetails[int.parse(marker.id)],
estate: this.estate,
parcela: widget.parcela)
: corte[1] == "tipo:2"
? new SensorPage(
elemento: sensorsDetails[int.parse(marker.id)],
estate: this.estate,
parcela: widget.parcela)
: null)
);
});
}
});
}
....
set.seed(12)
l1 = as.data.frame(spsample(SpatialLines(list(Lines(Line(cbind(p1, p2)), ID="a"))),
10000, "regular"))
set.seed(12)
l2 = as.data.frame(spsample(SpatialLines(list(Lines(Line(cbind(p1, p2)), ID="a"))),
10000, "regular"))
....
# [1] TRUE
# [1] TRUE
# [1] TRUE
....
替代sf
当我成为sp
程序包的忠实拥护者时,我测试了它是否会遇到相同的问题。事实并非如此:
(不要感到困惑,sf
和sf
对象之间进行了一些转换,以便尽可能接近OP中给出的代码)
sp