#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. Пожалуйста. Я желаю вам всего наилучшего в вашей работе. Ваше здоровье.