d3 world map - вычислить географические границы при увеличении

Я пытаюсь адаптировать пример ограниченного увеличения изображения Майка Бостока, чтобы он соответствовал моим потребностям. ( http://bl.ocks.org/mbostock/4987520). Есть ли способ рассчитать географические границы (в длинном / латинском направлении) проекции при увеличении карты. Метод d3.geo.bounds() ожидает "функцию" - я действительно не хочу увеличивать масштаб для какой-либо конкретной функции. Все, что я хочу, - это географические границы для видимой области проекции.

Заранее спасибо, Кишоре

2 ответа

Другим моим ответом было неверное прочтение вопроса, но я оставлю его там на тот случай, если кто-то другой не так прочитает вопрос.

Чтобы найти ограничивающую рамку визуальной области вашей карты на экране, просто используйте функцию projection.invert() и введите ее в верхний левый и нижний правый углы SVG. Если у вас есть SVG 500x500, то это выглядит так:

 projection.invert([0,0])
 projection.invert([500,500])

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

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

Я не знаю какой-либо встроенной функциональности, чтобы дать границы набора функций, но вот довольно простая функция, которая делает это:

function boundingExtent(features) {
  var boundExtent = [[0,0],[0,0]];
  for (var x in features) {
    thisBounds = d3.geo.bounds(features[x]);
    boundExtent[0][0] = Math.min(thisBounds[0][0],boundExtent[0][0]);
    boundExtent[0][1] = Math.min(thisBounds[0][1],boundExtent[0][1]);
    boundExtent[1][0] = Math.max(thisBounds[1][0],boundExtent[1][0]);
    boundExtent[1][1] = Math.max(thisBounds[1][1],boundExtent[1][1]);
  }
  return boundExtent;
}

При этом вы можете просто передать массив объектов в boundingExtent(featureArray), и он вернет вам ограничивающий прямоугольник для всего вашего набора.

Другие вопросы по тегам