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), и он вернет вам ограничивающий прямоугольник для всего вашего набора.