Azure карты расхождения позиций кластера - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть список позиций, которые я получаю из конечной точки мс, например:
https://atlas.microsoft.com/search/fuzzy/json?top=100&typeahead=true&subscription-key=subscription-key&api-version=1&query=Leeds
Затем пользователь выбирает один из предложенных адресов и позицию, предоставленную эта конечная точка затем используется для отображения на карте, которая использует кластеры. Например, для Лидса у меня есть следующее: -1.548567, 53.801277

Однако, когда я создаю кластеры в функции clusterRenderCallback, которую я предоставляю при создании HtmlMarkerLayer, я получаю позиции, близкие к те, что я предоставил, , но отличаются , и я понятия не имею, как и почему.

, поэтому код будет выглядеть примерно так:
Сначала я создаю источник данных

dataSource = new atlas.source.DataSource(null, {
  //Tell the data source to cluster point data.
  cluster: true
});
map.sources.add(dataSource);

Затем я управляю созданием кластера внутри HtmlMarkerLayer создания:

clusterRenderCallback: function (id, position, properties) {
  var cluster = new atlas.HtmlMarker({
    position: position, // different position to that which I have provided
    htmlContent: `<div>${properties.point_count_abbreviated}</div>`,
    values: properties,
  });

  map.events.add('click', cluster, clusterClicked);

  return cluster;
}

И здесь я создаю точки для добавления в мой источник данных:

let features = list.map(x => new atlas.data.Feature(new atlas.data.Point(new atlas.data.Position(x.lon, x.lat)), x));
dataSource.add(features);

Позиция, которую я получаю, например, для кластера в Лидсе: -1.549072265625, 53.80065082633024, хотя у меня в Лидсе было 2 позиции, обе из которых были с одинаковыми координатами: -1.548567, 53.801277
Похоже, что есть какая-то механизма внутри кода атласа, который «фиксирует» предоставленные координаты; кто-нибудь знает, как это остановить или что я здесь делаю неправильно?

== РЕДАКТИРОВАТЬ 02/05 ==

хорошо, так что после ответа @rbrundritt, здесь последний бит кода, который я должен добавили, показывая, что мы делаем после нажатия на кластер:

function clusterClicked(e) {
  var cluster = e.target;

  datasource.getClusterExpansionZoom(cluster.properties.cluster_id).then(function (zoom) {

    map.setCamera({
      center: cluster.getOptions().position,
      zoom: zoom
    });
  });

}

И вот здесь у нас есть проблема с этим расхождением - нажатие на кластер увеличивает масштаб до уровня масштабирования, где кластер разрушается; однако, поскольку мы центрируем карту по положению кластера, положение булавки, отличное от положения кластера, не отображается на карте при таком уровне масштабирования (ie 3 в воздухе). Кроме того, у нас нет способа узнать в контексте этой функции, какому выводу соответствует кластер, это оставляет нам ошибочное поведение.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Хорошо, поэтому я не знал о том, что возвращал метод datasource.getClusterLeaves (я просто принял листья за глагол ухода). Это то, что я искал, поэтому мой код теперь выглядит так:

function inSamePosition(pos1, pos2) {
  return pos1.data.geometry.coordinates[0] == pos2.data.geometry.coordinates[0] 
    && pos1.data.geometry.coordinates[1] == pos2.data.geometry.coordinates[1];
}

function clusterClicked(e) {
  var cluster = e.target;
  (cluster.properties.cluster_id, Number.POSITIVE_INFINITY, 0).then(pins => {
    let position = pins.every(p => inSamePosition(p, pins[0])) ? pins[0]['data'].geometry.coordinates : null;
    datasource.getClusterExpansionZoom(cluster.properties.cluster_id).then(function (zoom) {
      map.setCamera({
        center: position ? position : cluster.getOptions().position,
        zoom: zoom
      });
    });
  })
}
0 голосов
/ 30 апреля 2020

Кластеры редко должны иметь те же координаты, что и любые содержащиеся в них точки. Кластеры группируют перекрывающиеся точки вместе, и среднее положение используется для представления этой группы на карте. Когда кластер распадается на отдельные точки, этот маркер будет иметь исходное значение позиции.

...