В контексте картографических приложений полигон представляет собой замкнутую ломаную линию, заданную набором географических координат. В Google Maps JavaScript API полигон описывается массивом вершин, каждая из которых содержит широту и долготу. При этом важно учитывать, что поверхность Земли не является плоской, поэтому расчёты площади выполняются на сфере или эллипсоиде, а не в декартовой плоскости.
Геометрически полигон интерпретируется как область, ограниченная последовательностью точек:
В браузерной реализации Google Maps JavaScript API используется встроенный модуль геометрии, который учитывает кривизну Земли и позволяет получать корректные значения площади без самостоятельной реализации сферической математики.
В библиотеке Google Maps JavaScript API доступен дополнительный
модуль geometry, который подключается отдельно:
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry"></script>
Этот модуль содержит набор функций для работы с географическими вычислениями:
Ключевым пространством имён является:
google.maps.geometry.spherical
Основной метод для расчёта площади — computeArea. Он
принимает массив объектов LatLng и возвращает площадь в
квадратных метрах.
google.maps.geometry.spherical.computeArea(path: LatLng[]): number
const polygonPath = [
new google.maps.LatLng(50.4501, 30.5234),
new google.maps.LatLng(50.4510, 30.5250),
new google.maps.LatLng(50.4490, 30.5280),
new google.maps.LatLng(50.4475, 30.5240)
];
const area = google.maps.geometry.spherical.computeArea(polygonPath);
console.log("Площадь:", area, "м²");
В этом примере массив точек формирует замкнутую область, после чего вычисляется её площадь с учётом сферической модели Земли.
На практике полигон чаще создаётся через класс Polygon,
который является частью API:
const polygon = new google.maps.Polygon({
paths: polygonPath,
strokeColor: "#FF0000",
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: "#FF0000",
fillOpacity: 0.35
});
polygon.setMap(map);
Для вычисления площади достаточно получить путь полигона:
const path = polygon.getPath();
const area = google.maps.geometry.spherical.computeArea(path.getArray());
Часто полигоны редактируются пользователем. В этом случае площадь должна пересчитываться при каждом изменении геометрии.
google.maps.event.addListener(polygon.getPath(), "set_at", updateArea);
google.maps.event.addListener(polygon.getPath(), "insert_at", updateArea);
google.maps.event.addListener(polygon.getPath(), "remove_at", updateArea);
function updateArea() {
const area = google.maps.geometry.spherical.computeArea(
polygon.getPath().getArray()
);
document.getElementById("area").textContent = area.toFixed(2);
}
Такой подход обеспечивает синхронизацию геометрии и вычисляемых значений в реальном времени.
Каждая вершина полигона задаётся объектом:
new google.maps.LatLng(lat, lng)
Особенности модели:
При больших полигонах (например, охватывающих несколько километров)
плоская геометрия даёт значительную погрешность, поэтому использование
geometry.spherical критично для точности.
Алгоритм вычисления площади основан на сферической триангуляции. Контур полигона разбивается на треугольники, после чего площадь каждого треугольника суммируется.
Особенности:
Если требуется высокая точность в инженерных задачах, иногда используется проекция координат в локальную плоскость, однако в большинстве случаев встроенного метода достаточно.
Полигоны могут содержать внутренние области (holes), которые вычитаются из общей площади.
const polygon = new google.maps.Polygon({
paths: [
outerPath,
innerHolePath
]
});
При вычислении площади внутренние контуры автоматически учитываются как вычитаемые области.
В интерактивных картографических интерфейсах пользователь может изменять вершины:
В таких сценариях вычисление площади должно быть привязано к событиям изменения пути:
function bindPolygonEvents(polygon) {
const path = polygon.getPath();
["set_at", "insert_at", "remove_at"].forEach(event => {
path.addListener(event, () => {
const area = google.maps.geometry.spherical.computeArea(path.getArray());
console.log(area);
});
});
}
Типичный сценарий включает отображение результата в UI:
const areaValue = google.maps.geometry.spherical.computeArea(
polygon.getPath().getArray()
);
document.querySelector("#area-box").innerHTML =
`Площадь участка: ${areaValue.toFixed(2)} м²`;
При необходимости можно конвертировать значение:
Для сложных географических объектов важно учитывать:
В таких случаях корректность результата зависит от структуры массива координат. Рекомендуется избегать самопересечений, так как геометрический алгоритм может интерпретировать их неоднозначно.
При работе с большим количеством вершин (сотни и тысячи точек):
Пример оптимизации:
let timeout;
function updateAreaDebounced() {
clearTimeout(timeout);
timeout = setTimeout(() => {
const area = google.maps.geometry.spherical.computeArea(
polygon.getPath().getArray()
);
console.log(area);
}, 100);
}
Расчёт площади полигона часто применяется в задачах:
В каждом случае Google Maps API выступает как геопространственный слой, а вычисление площади — как базовая операция над геометрией.