Нельзя щелкнуть по точкам векторной плитки поверх полигонов

#javascript #openlayers

Вопрос:

Я создал свои собственные векторные данные tile .pbf, состоящие из полигонов, линий и точек.

Источником данных .pbf является групповой проигрыватель шейп-файлов на Геосервере, где каждый шейп-файл упорядочен таким образом, что точки находятся вверху:

порядок слоев геосервера

Используя открытые слои, я оформил векторные плитки и последовал примеру «Информация о векторных плитках«. Разница в том, что мой переключается одним щелчком мыши.

Проблема в том, что я не могу щелкнуть по какой-либо точке, даже в виде спрайтового изображения, если она полностью находится внутри многоугольника. Можно щелкнуть по линиям, которые полностью находятся внутри многоугольника. Нижележащие полигоны выбираются как объект[0] при попытке выбрать точку.

Точки, Отображаемые Под Многоугольниками

В чем может быть причина такого порядка отображения? Что точка-это всего лишь один пиксель? Каким может быть лекарство? Я очень новичок в JavaScript и OpenLayers, поэтому надеюсь, что это что-то наивное. Мне нужно уметь расставлять приоритеты по точкам, когда они окружены многоугольником.

Ответ №1:

Порядок возвращаемых объектов, по map.getFeaturesAtPixel() -видимому, случайный и не связан с порядком рендеринга. Либо проверьте все возвращаемые объекты, а не только ввод [0] , либо отсортируйте массив таким образом, чтобы точки/мультиточечные точки были ниже в порядке сортировки, чем строки/многолинейные строки с последними полигонами

 function rank(feature) {
  var type = feature.getType();
  if (type.indexOf('Point') > -1) {
    return 1;
  } else if (type.indexOf('LineString') > -1) {
    return 2;
  } else {
    return 3;
  }
}

map.getFeaturesAtPixel(event.pixel).sort(function(a, b) {
  return rank(a) - rank(b);
});
 

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

1. Привет, Майк, я нацарапал Javascript и сумел заставить это работать, спасибо, что дал мне чему-то научиться. Что касается, казалось бы, случайного возврата функции, я подозреваю, что порядок возвращаемых функций основан на близости к выбранному пикселю (в пределах допустимого). Я не пробовал это без разрешения, но в целом это очень затрудняет нажатие на точку без него.