Работа с географическими данными в D3.js опирается на сферическую модель Земли, где вычисления выполняются не в декартовой плоскости, а на сфере. Это принципиально меняет подход к расстояниям и площадям: вместо привычной евклидовой геометрии используются угловые величины, выраженные в радианах, а результаты интерпретируются через радиус Земли или через нормированные сферические единицы.
Географические функции D3 работают с координатами в формате GeoJSON, где точки задаются как:
[долгота, широта]
Все вычисления предполагают:
Это означает, что любые результаты из d3.geoDistance() и
d3.geoArea() возвращаются в радианах или стерадианах и
требуют интерпретации.
d3.geoDistance(a, b) вычисляет угловое
расстояние по поверхности сферы между двумя точками, следуя
кратчайшему пути по большой окружности.
Фактически возвращается:
[ ]
где θ — центральный угол между радиус-векторами точек.
Функция принимает два GeoJSON-координатных массива:
const a = [lon1, lat1];
const b = [lon2, lat2];
const d = d3.geoDistance(a, b);
Результат — это радианы. Чтобы получить привычные единицы расстояния, применяется радиус Земли:
[ distance = R ]
где:
d3.geoDistanceimport * as d3 from "d3-geo";
const london = [-0.1276, 51.5072];
const newYork = [-74.0060, 40.7128];
const angle = d3.geoDistance(london, newYork);
const distanceKm = 6371 * angle;
console.log(distanceKm);
d3.geoArea() вычисляет сферическую площадь
GeoJSON-объекта, выраженную в стерадианах.
Для единичной сферы:
Функция принимает любой GeoJSON-объект:
PolygonMultiPolygonFeatureFeatureCollectionПример:
const polygon = {
type: "Polygon",
coordinates: [
[
[-10, 0],
[10, 0],
[10, 10],
[-10, 10],
[-10, 0]
]
]
};
const area = d3.geoArea(polygon);
Результат — доля поверхности сферы:
[ A = ]
где Ω — телесный угол (solid angle).
Чтобы перевести в долю поверхности Земли:
[ fraction = ]
Чтобы получить площадь в км²:
[ area_{km^2} = A R^2]
const earthRadius = 6371;
const areaSteradians = d3.geoArea(polygon);
const areaKm2 = areaSteradians * earthRadius * earthRadius;
| Функция | Вход | Выход | Геометрический смысл |
|---|---|---|---|
| geoDistance | 2 точки | радианы | угол большой окружности |
| geoArea | GeoJSON объект | стерадианы | площадь на сфере |
Обе функции работают в условиях:
Угловая мера позволяет:
Стерадианная мера позволяет:
const filtered = points.filter(p =>
d3.geoDistance(p, center) < 0.5
);
if (d3.geoArea(region) > 1) {
renderHighDetail(region);
} else {
renderSimplified(region);
}
Важно учитывать, что:
d3.geoDistance() и d3.geoArea() не зависят
от проекцийЭто позволяет: