- Omówienie
- Pojęcia związane z geometrią sferyczną
- Kodowanie geometryczne
- Funkcje wielokąta i linii łamanej
Omówienie
Pojęcia w tym dokumencie odnoszą się wyłącznie do funkcji
dostępne w bibliotece google.maps.geometry
. Ten
biblioteka nie jest domyślnie wczytywana podczas wczytywania interfejsu Maps JavaScript API
lecz musi być wyraźnie określone za pomocą atrybutu libraries
parametru wczytywania. Więcej informacji:
Omówienie bibliotek.
Biblioteka geometrii Maps JavaScript API zapewnia użyteczność do obliczania danych geometrycznych na powierzchni Ziemię. Biblioteka obejmuje 3 przestrzenie nazw:
spherical
zawiera narzędzia do geometrii kulistej umożliwiające obliczenie kątów, odległości i obszaru geograficznego na podstawie szerokości i długości geograficznej.encoding
zawiera narzędzia do kodowania i dekodowania ścieżek linii łamanych zgodnie z Zakodowany Algorytm linii łamanej.poly
zawiera funkcje użytkowe na potrzeby obliczeń obejmujących wielokąty oraz linii łamanych.
Biblioteka google.maps.geometry
nie zawiera żadnych
zajęcia; , biblioteka zawiera metody statyczne na powyższej liście
przestrzeni nazw.
Pojęcia geometrii sferycznej
Obrazy w Maps JavaScript API są dwuwymiarowe i „płaski”. Ziemia jest natomiast trójwymiarowa i często w przybliżeniu jako oblata sferoidowa lub więcej jako sferę. W interfejsie API Map Google używamy kuli. przedstawiają Ziemię na dwuwymiarowej płaskiej powierzchni, takiej jak ekran Twojego komputera – interfejs API Map Google wykorzystuje .
W perspektywie 2D wygląd może być czasem mylący. Ponieważ rzutowanie mapy wymaga pewnych zniekształceń, Geometria euklidyjska często nie ma zastosowania. Na przykład najkrótsza odległość między dwoma punktami na kuli nie jest linią prostą, ale wielkim okręgiem (rodzaj zjawiska geodezyjnego) oraz kąty tworzące trójkąt na powierzchni całkowita suma kuli wynosi ponad 180 stopni.
Ze względu na te różnice funkcje geometryczne na kuli (lub
prognozy) wymaga użycia funkcji
Geometria sferyczna
do obliczania
takich obiektów jak odległość, kierunek i powierzchnia. Usługi komunalne
i obliczyć te kuliste konstrukcje geometryczne zawarte na Mapach
Przestrzeń nazw interfejsu API google.maps.geometry.spherical
. Ta przestrzeń nazw
udostępnia statyczne metody obliczania wartości skalarnych na podstawie współrzędnych sferycznych
(długości i szerokości geograficzne).
Funkcje odległości i powierzchni
Odległość między dwoma punktami to długość najkrótszej ścieżki między
. Ta najkrótsza ścieżka jest nazywana geodezyjną. Wszystkie obszary geodezyjne na kuli są
z segmentów wielkiego kręgu. Aby obliczyć tę odległość, wywołaj funkcję
computeDistanceBetween()
, osiągając wynik 2 LatLng
obiektów.
Zamiast tego możesz użyć funkcji
computeLength()
, aby obliczyć długość,
danej ścieżki, jeśli masz kilka lokalizacji.
Wyniki dotyczące odległości są wyrażone w metrach.
Aby obliczyć pole powierzchni wielokąta (w metrach kwadratowych), wywołaj
computeArea()
, przekazując tablicę obiektów LatLng
tworząc pętlę
zamkniętą.
Funkcje nawigacyjne
W przypadku nawigacji po kuli nagłówek to kąt danego kierunku.
od stałego punktu odniesienia, zwykle jest to północ prawdziwa. W ramach interfejsu API Map Google
kierunek jest zdefiniowany w stopniach od rzeczywistej północy, gdzie kierunek jest mierzony
w prawo od prawdziwej północy (0 stopni). Możesz obliczyć ten nagłówek między
dwóch lokalizacji
computeHeading()
, z wynikiem 2
from
i to
obiekty LatLng
.
Biorąc pod uwagę określony kierunek, lokalizację początkową i odległość
przebytej trasy (w metrach), można obliczyć współrzędne miejsca docelowego za pomocą funkcji
computeOffset()
Biorąc pod uwagę 2 obiekty LatLng
o wartości od 0 do 1,
możemy też obliczyć miejsce docelowe między nimi za pomocą
Metoda interpolate()
, która przeprowadza sferyczną liniową płaszczyznę liniową
między dwiema lokalizacjami, gdzie wartość wskazuje
odległość ułamkowa, jaką musi przebyć ścieżka z punktu początkowego do
miejsce docelowe.
Następujący przykład pokazuje utworzenie dwóch linii łamanych po kliknięciu dwóch punktów. na mapie — jedno geodezyjne i jedno „proste” linia łącząca obie i oblicza kierunek podróży między dwa punkty:
TypeScript
// This example requires the Geometry library. Include the libraries=geometry // parameter when you first load the API. For example: // <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry"> let marker1: google.maps.Marker, marker2: google.maps.Marker; let poly: google.maps.Polyline, geodesicPoly: google.maps.Polyline; function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 4, center: { lat: 34, lng: -40.605 }, } ); map.controls[google.maps.ControlPosition.TOP_CENTER].push( document.getElementById("info") as HTMLElement ); marker1 = new google.maps.Marker({ map, draggable: true, position: { lat: 40.714, lng: -74.006 }, }); marker2 = new google.maps.Marker({ map, draggable: true, position: { lat: 48.857, lng: 2.352 }, }); const bounds = new google.maps.LatLngBounds( marker1.getPosition() as google.maps.LatLng, marker2.getPosition() as google.maps.LatLng ); map.fitBounds(bounds); google.maps.event.addListener(marker1, "position_changed", update); google.maps.event.addListener(marker2, "position_changed", update); poly = new google.maps.Polyline({ strokeColor: "#FF0000", strokeOpacity: 1.0, strokeWeight: 3, map: map, }); geodesicPoly = new google.maps.Polyline({ strokeColor: "#CC0099", strokeOpacity: 1.0, strokeWeight: 3, geodesic: true, map: map, }); update(); } function update() { const path = [ marker1.getPosition() as google.maps.LatLng, marker2.getPosition() as google.maps.LatLng, ]; poly.setPath(path); geodesicPoly.setPath(path); const heading = google.maps.geometry.spherical.computeHeading( path[0], path[1] ); (document.getElementById("heading") as HTMLInputElement).value = String(heading); (document.getElementById("origin") as HTMLInputElement).value = String( path[0] ); (document.getElementById("destination") as HTMLInputElement).value = String( path[1] ); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
// This example requires the Geometry library. Include the libraries=geometry // parameter when you first load the API. For example: // <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry"> let marker1, marker2; let poly, geodesicPoly; function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 4, center: { lat: 34, lng: -40.605 }, }); map.controls[google.maps.ControlPosition.TOP_CENTER].push( document.getElementById("info"), ); marker1 = new google.maps.Marker({ map, draggable: true, position: { lat: 40.714, lng: -74.006 }, }); marker2 = new google.maps.Marker({ map, draggable: true, position: { lat: 48.857, lng: 2.352 }, }); const bounds = new google.maps.LatLngBounds( marker1.getPosition(), marker2.getPosition(), ); map.fitBounds(bounds); google.maps.event.addListener(marker1, "position_changed", update); google.maps.event.addListener(marker2, "position_changed", update); poly = new google.maps.Polyline({ strokeColor: "#FF0000", strokeOpacity: 1.0, strokeWeight: 3, map: map, }); geodesicPoly = new google.maps.Polyline({ strokeColor: "#CC0099", strokeOpacity: 1.0, strokeWeight: 3, geodesic: true, map: map, }); update(); } function update() { const path = [marker1.getPosition(), marker2.getPosition()]; poly.setPath(path); geodesicPoly.setPath(path); const heading = google.maps.geometry.spherical.computeHeading( path[0], path[1], ); document.getElementById("heading").value = String(heading); document.getElementById("origin").value = String(path[0]); document.getElementById("destination").value = String(path[1]); } window.initMap = initMap;
Zobacz próbkę
Metody kodowania
Ścieżki w Maps JavaScript API są często określane jako
Array
z LatLng
obiektów. Jednak mijanie
Taka tablica jest często niepożądana. Zamiast tego możesz użyć
linia łamana
algorytmem kodowania, aby skompresować daną ścieżkę, co umożliwia później
dekompresować przez dekodowanie.
geometry
biblioteka zawiera encoding
przestrzeń nazw do kodowania i dekodowania linii łamanych.
Metoda statyczna encodePath()
koduje podaną ścieżkę.
Można przekazać tablicę LatLng
lub
MVCArray
(zwracany przez
Polyline.getPath()
).
Aby zdekodować zakodowaną ścieżkę, wywołaj decodePath()
jako zakodowany ciąg znaków.
Poniższy przykład przedstawia mapę Oksfordu w stanie Missisipi. Kliknięcie na mapie powoduje dodanie punktu do linii łamanej. Ponieważ linia łamana jest pojawi się pod nim kodowanie.
TypeScript
// This example requires the Geometry library. Include the libraries=geometry // parameter when you first load the API. For example: // <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry"> function initMap(): void { const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 14, center: { lat: 34.366, lng: -89.519 }, } ); const poly = new google.maps.Polyline({ strokeColor: "#000000", strokeOpacity: 1, strokeWeight: 3, map: map, }); // Add a listener for the click event google.maps.event.addListener(map, "click", (event) => { addLatLngToPoly(event.latLng, poly); }); } /** * Handles click events on a map, and adds a new point to the Polyline. * Updates the encoding text area with the path's encoded values. */ function addLatLngToPoly( latLng: google.maps.LatLng, poly: google.maps.Polyline ) { const path = poly.getPath(); // Because path is an MVCArray, we can simply append a new coordinate // and it will automatically appear path.push(latLng); // Update the text field to display the polyline encodings const encodeString = google.maps.geometry.encoding.encodePath(path); if (encodeString) { (document.getElementById("encoded-polyline") as HTMLInputElement).value = encodeString; } } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;
JavaScript
// This example requires the Geometry library. Include the libraries=geometry // parameter when you first load the API. For example: // <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry"> function initMap() { const map = new google.maps.Map(document.getElementById("map"), { zoom: 14, center: { lat: 34.366, lng: -89.519 }, }); const poly = new google.maps.Polyline({ strokeColor: "#000000", strokeOpacity: 1, strokeWeight: 3, map: map, }); // Add a listener for the click event google.maps.event.addListener(map, "click", (event) => { addLatLngToPoly(event.latLng, poly); }); } /** * Handles click events on a map, and adds a new point to the Polyline. * Updates the encoding text area with the path's encoded values. */ function addLatLngToPoly(latLng, poly) { const path = poly.getPath(); // Because path is an MVCArray, we can simply append a new coordinate // and it will automatically appear path.push(latLng); // Update the text field to display the polyline encodings const encodeString = google.maps.geometry.encoding.encodePath(path); if (encodeString) { document.getElementById("encoded-polyline").value = encodeString; } } window.initMap = initMap;
Zobacz próbkę
Funkcje wielokąta i linii łamanej
Przestrzeń nazw poly
biblioteki geometrii zawiera funkcje użytkowe
które określają, czy dany punkt znajduje się wewnątrz wielokąta, w jego pobliżu lub w pobliżu
linia łamana.
containsLocation()
containsLocation(point:LatLng, polygon:Polygon)
Aby sprawdzić, czy dany punkt mieści się w wielokątie, przekaż go
wielokąt do google.maps.geometry.poly.containsLocation()
.
funkcje zwraca wartość „true” (prawda), jeśli punkt znajduje się w obrębie wielokąta lub na jego krawędzi.
Ten kod zapisuje „true” do konsoli przeglądarki, jeśli użytkownik kliknie mieści się w zdefiniowanym trójkącie; w przeciwnym razie ma wartość „false” (fałsz).
function initialize() { var mapOptions = { zoom: 5, center: new google.maps.LatLng(24.886, -70.269), mapTypeId: 'terrain' }; var map = new google.maps.Map(document.getElementById('map'), mapOptions); var bermudaTriangle = new google.maps.Polygon({ paths: [ new google.maps.LatLng(25.774, -80.190), new google.maps.LatLng(18.466, -66.118), new google.maps.LatLng(32.321, -64.757) ] }); google.maps.event.addListener(map, 'click', function(event) { console.log(google.maps.geometry.poly.containsLocation(event.latLng, bermudaTriangle)); }); } google.maps.event.addDomListener(window, 'load', initialize);
Inna wersja tego kodu rysuje na mapie niebieski trójkąt, jeśli kliknięcie spada.
w Trójkącie Bermudzkim, a czerwone koło:
isLocationOnEdge()
isLocationOnEdge(point:LatLng, poly:Polygon|Polyline, tolerance?:number)
Aby określić, czy punkt znajduje się na linii łamanej, w pobliżu lub na
na krawędzi wielokąta, przekazać punkt, linię łamaną/wielokąt
wartość tolerancji w stopniach na
google.maps.geometry.poly.isLocationOnEdge()
Funkcja
zwraca wartość prawda, jeśli odległość między punktem a najbliższym punktem na drodze
linia lub krawędź mieści się w określonej tolerancji. Domyślna tolerancja
ma wartość 10–9 stopni.
function initialize() { var myPosition = new google.maps.LatLng(46.0, -125.9); var mapOptions = { zoom: 5, center: myPosition, mapTypeId: 'terrain' }; var map = new google.maps.Map(document.getElementById('map'), mapOptions); var cascadiaFault = new google.maps.Polyline({ path: [ new google.maps.LatLng(49.95, -128.1), new google.maps.LatLng(46.26, -126.3), new google.maps.LatLng(40.3, -125.4) ] }); cascadiaFault.setMap(map); if (google.maps.geometry.poly.isLocationOnEdge(myPosition, cascadiaFault, 10e-1)) { alert("Relocate!"); } } google.maps.event.addDomListener(window, 'load', initialize);