sp :: spsample(...,...,type ='regular')仍然有些随机性

时间:2019-02-20 15:43:22

标签: r sp

我正在使用sp::SpatialLines构建spsample。在文档中,它是为spsample(x, n, type, ...)编写的:

  

type:字符; “随机”表示完全空间随机; “常规”用于常规(系统对齐)采样; [...]

但是,我刚刚意识到,在相同的两点之间用spsampletype='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"

我一直在代码中奋力拼搏,以了解为什么测量(应该是)两个相同点和(应该是)两条相同线之间的距离并不能得出严格相同的结果。

有人知道为什么会这样,以及如何确保连续运行之间的结果一致吗? (或:是否有其他选择可以像上面一样建立两条相同的线?)

1 个答案:

答案 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程序包的忠实拥护者时,我测试了它是否会遇到相同的问题。事实并非如此:
(不要感到困惑,sfsf对象之间进行了一些转换,以便尽可能接近OP中给出的代码)

sp