R: Фильтрация GPS-координат на основе значения BBOX, ошибка в реализации

#r #gis #geospatial

#r #гис #геопространственные

Вопрос:

Я хотел бы отфильтровать координаты, которые не находятся в заданном BBOX.

У меня есть следующий список точек GPS, и для проверки этой проблемы я знаю, что все они находятся в BBOX:

 V1 V2  1: 47.8924 11.7018  2: 47.81252 12.07387  3: 47.84976 12.08231  4: 47.89307 11.69957  5: 47.8497 12.0824  6: 47.8497 12.08272  7: 47.89152 11.69514  8: 47.88932 11.70749  9: 47.84252 12.11194 10: 47.80853 12.07071  

Кроме того, у меня есть следующий BBOX:

 xmin ymin xmax ymax  11.71541 47.77093 12.32288 48.17883   

Я знаю, что все эти точки находятся в BBOX.

Чтобы проверить, что я использую следующую функцию:

 vec_geofence lt;- function(left, bottom, right,top, lat, lon) {    # The mask vector represents whether a coordinate is seen in any of the  # fences defined by the top, left, bottom and right vectors. In the beginning  # all the coordinates haven't been tested, so the respective value in the  # mask vector is initialized as False.  mask lt;- rep(F, length(lon))    # For each fence...  for(i in seq_along(top)) {    # ... check for all the coordinates if they are inside of the fence  if( left[i] gt; right[i] )  new_mask lt;- top[i] gt;= lat amp; lat gt;= bottom[i] amp; (left[i] lt;= lon | lon lt;= right[i])  else  new_mask lt;- top[i] gt;= lat amp; lat gt;= bottom[i] amp; (left[i] lt;= lon amp; lon lt;= right[i])    # For all the coordinates that hadn't yet been seen in a fence, and that  # are inside the current fence, update the respective mask value to True  mask[!mask][new_mask] lt;- T    # The coordinates that will pass through to the next fence check are the ones  # that still haven't been seen inside a fence  lat lt;- lat[!new_mask]  lon lt;- lon[!new_mask]  }    mask }  

Эта функция создает вектор индекса истинных/ложных значений , чтобы я мог отфильтровать, какие точки не находятся в данном BBOX. И все же где-то есть ошибка.

Это должно дать мне вектор только истинных значений, так как все точки на самом деле находятся в BBOX. Тем не менее, это приводит к следующему результату:

 [1] FALSE TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE  

Это означает, что в соответствии с функцией не все заданные точки находятся в поле B.

Пожалуйста, помогите мне найти ошибку. Спасибо!

############## Пример ДАННЫХ:

 test_datalt;-structure(list(V1 = c("47.8924", "47.81252", "47.84976", "47.89307",   "47.8497", "47.8497", "47.89152", "47.88932",   "47.84252", "47.80853"),   V2 = c("11.7018", "12.07387", "12.08231", "11.69957",   "12.0824","12.08272", "11.69514", "11.70749",   "12.11194", "12.07071")),   row.names = c(NA,-10L), class = c("data.table", "data.frame"))  bbox_dimensions lt;- structure(c(xmin = 11.7154051652041, ymin = 47.7709252414407,   xmax = 12.3228827739125, ymax = 48.1788333505125),   class = "bbox", crs = structure(list(  input = "EPSG:4326", wkt = "GEOGCS["WGS 84",n   DATUM["WGS_1984",n SPHEROID["WGS 84",6378137,298.257223563,n   AUTHORITY["EPSG","7030"]],n AUTHORITY["EPSG","6326"]],n   PRIMEM["Greenwich",0,n AUTHORITY["EPSG","8901"]],n   UNIT["degree",0.0174532925199433,n   AUTHORITY["EPSG","9122"]],n   AUTHORITY["EPSG","4326"]]"), class = "crs"))  vec_geofence lt;- function(left, bottom, right,top, lat, lon) {    # The mask vector represents whether a coordinate is seen in any of the  # fences defined by the top, left, bottom and right vectors. In the beginning  # all the coordinates haven't been tested, so the respective value in the  # mask vector is initialized as False.  mask lt;- rep(F, length(lon))    # For each fence...  for(i in seq_along(top)) {    # ... check for all the coordinates if they are inside of the fence  if( left[i] gt; right[i] )  new_mask lt;- top[i] gt;= lat amp; lat gt;= bottom[i] amp; (left[i] lt;= lon | lon lt;= right[i])  else  new_mask lt;- top[i] gt;= lat amp; lat gt;= bottom[i] amp; (left[i] lt;= lon amp; lon lt;= right[i])    # For all the coordinates that hadn't yet been seen in a fence, and that  # are inside the current fence, update the respective mask value to True  mask[!mask][new_mask] lt;- T    # The coordinates that will pass through to the next fence check are the ones  # that still haven't been seen inside a fence  lat lt;- lat[!new_mask]  lon lt;- lon[!new_mask]  }    mask }  test_data_indexlt;-vec_geofence(bbox_dimensions[1],bbox_dimensions[2],bbox_dimensions[3],bbox_dimensions[4],  as.numeric(test_data$V1), as.numeric(test_data$V2))  

Комментарии:

1. В качестве быстрого предположения, поскольку ваш вектор приемника инициализирован как FALSE, в вашем устройстве есть что for -то, if что заставляет пропускать оценку…следовательно, оставлять значение FALSE. Вам debugonce(vec_geofence) нужно отслеживать эволюцию ИСТИННОГО/ЛОЖНОГО через цикл?

2. Привет @Andreas, я не погружался в вашу функцию, но я использовал sf библиотеку для выполнения того же теста, что и вы (т. Е. Все ли точки внутри bbox?), И я получаю точно такой же результат, как и у вас с вашей функцией. Кроме того, при построении графика вашей bbox и ваших точек некоторые из них визуально находятся за пределами bbox. Итак, мой вопрос: вы уверены, что все ваши точки хорошо вписаны в bbox? Надеюсь, это поможет. Ваше здоровье.

3. Точнее, и если это может вам помочь, точки внутри имеют следующие идентификаторы: 2 , 3 , 5 , 6 , 9 , 10 и все они имеют долготу 12.xxxx. Точки снаружи имеют долготу 11.ххх Ура.

4. Большое вам спасибо, что нашли время! Хм, странно, я еще раз проверю данные! Я получаю это из api карт, поэтому я как бы полагался на то, что он будет правильным.

5. Нет проблем, я с удовольствием это сделаю. Цель состоит в том, чтобы попытаться помочь вам. К вашему сведению, точки за пределами bbox расположены на окраине Хольцкирхена вдоль дороги MB9. Это кажется правильным. Может быть, это неправильный размер вашего bbox? Ваше здоровье.

Ответ №1:

Оказывается, мои данные были неверными. Алгоритм работает так, как задумано. Спасибо, что указали на это.

Комментарии:

1. Пожалуйста. Я желаю вам всего наилучшего в вашей работе. Ваше здоровье.