ज्यामिति लाइब्रेरी

  1. खास जानकारी
  2. गोलाकार ज्यामिति के सिद्धांत
    1. दूरी और क्षेत्रफल के फ़ंक्शन
    2. नेविगेशन फ़ंक्शन
  3. ज्यामिति एन्कोडिंग
  4. पॉलीगॉन और पॉलीलाइन फ़ंक्शन
    1. containsLocation()
    2. isLocationOnEdge()

खास जानकारी

इस दस्तावेज़ में बताए गए कॉन्सेप्ट, सिर्फ़ google.maps.geometry लाइब्रेरी में उपलब्ध सुविधाओं के बारे में बताते हैं. Maps JavaScript API को लोड करने पर, यह लाइब्रेरी डिफ़ॉल्ट रूप से लोड नहीं होती. हालांकि, libraries बूटस्ट्रैप पैरामीटर का इस्तेमाल करके, इसकी जानकारी साफ़ तौर पर दी जानी चाहिए. ज़्यादा जानकारी के लिए, लाइब्रेरी की खास जानकारी देखें.

Maps JavaScript API की ज्यामिति लाइब्रेरी, धरती की सतह पर ज्यामितीय डेटा का हिसाब लगाने के लिए, काम के फ़ंक्शन उपलब्ध कराती है. लाइब्रेरी में तीन नेमस्पेस शामिल हैं:

  • spherical में गोलाकार ज्यामिति की सुविधाएं होती हैं. इनकी मदद से, अक्षांश और देशांतर से कोण, दूरी, और क्षेत्र का हिसाब लगाया जा सकता है.
  • encoding में, एन्क्रिप्ट किए गए पॉलीलाइन एल्गोरिदम के हिसाब से, पॉलीलाइन पाथ को एन्कोड और डिकोड करने के लिए उपयोगी सुविधाएं होती हैं.
  • poly इसमें पॉलीगॉन और पॉलीलाइन से जुड़े कैलकुलेशन के लिए, यूटिलिटी फ़ंक्शन शामिल हैं.

google.maps.geometry लाइब्रेरी में कोई क्लास नहीं है. इसके बजाय, लाइब्रेरी में ऊपर दिए गए नेमस्पेस पर स्टैटिक तरीके मौजूद हैं.

गोलाकार ज्यामिति के कॉन्सेप्ट

Maps JavaScript API में मौजूद इमेज, दो-आयामी और "फ़्लैट" होती हैं. हालांकि, पृथ्वी तीन डाइमेंशन वाली है और अक्सर इसे थोड़े से चपटे गोले या गोले के तौर पर दिखाया जाता है. Maps API में हम स्फ़ीर का इस्तेमाल करते हैं. साथ ही, Maps API, प्रोजेक्शन का इस्तेमाल करके, धरती को दो डाइमेंशन वाली सपाट सतह पर दिखाता है. जैसे, आपके कंप्यूटर की स्क्रीन.

2D प्रोजेक्शन में, कभी-कभी चीज़ें अलग दिख सकती हैं. मैप प्रोजेक्शन के लिए, ज़रूरी है कि कुछ बदलाव किए जाएं. इसलिए, आम तौर पर यूक्लिडियन ज्यामिति लागू नहीं होती. उदाहरण के लिए, किसी गोले पर दो बिंदुओं के बीच की सबसे कम दूरी, सीधी रेखा नहीं होती, बल्कि एक ग्रेट सर्कल (जियोडेसिक का एक टाइप) होती है. साथ ही, गोले की सतह पर त्रिकोण बनाने वाले कोणों का योग 180 डिग्री से ज़्यादा होता है.

इन अंतरों की वजह से, किसी गोले (या उसके प्रोजेक्शन) पर ज्यामितीय फ़ंक्शन के लिए, गोलाकार ज्यामिति का इस्तेमाल करना ज़रूरी होता है. इससे दूरी, हेडिंग, और क्षेत्र जैसे कॉन्स्ट्रक्ट का हिसाब लगाया जा सकता है. गोलाकार ज्यामितीय कॉन्स्ट्रक्ट का हिसाब लगाने के लिए, Maps API के google.maps.geometry.spherical नेमस्पेस में उपयोगी सुविधाएं मौजूद हैं. यह नेमस्पेस, स्फ़ीरीय निर्देशांक (अक्षांश और देशांतर) से स्केलर वैल्यू का हिसाब लगाने के लिए स्टैटिक तरीके उपलब्ध कराता है.

दूरी और क्षेत्रफल के फ़ंक्शन

दो बिंदुओं के बीच की दूरी, उनके बीच के सबसे छोटे रास्ते की लंबाई होती है. इस सबसे छोटे रास्ते को जियोडेसिक कहा जाता है. किसी गोले पर, सभी जियोडेसिक, एक बड़े सर्कल के सेगमेंट होते हैं. इस दूरी का हिसाब लगाने के लिए, computeDistanceBetween() को कॉल करें और उसे दो LatLng ऑब्जेक्ट पास करें.

अगर आपके पास कई जगहें हैं, तो किसी पाथ की लंबाई का हिसाब लगाने के लिए, computeLength() का इस्तेमाल किया जा सकता है.

दूरी के नतीजे मीटर में दिखाए जाते हैं.

किसी पॉलीगॉन के क्षेत्रफल (वर्ग मीटर में) का हिसाब लगाने के लिए, computeArea() को कॉल करें. इसके लिए, LatLng ऑब्जेक्ट का ऐरे पास करें, जो किसी क्लोज़्ड लूप की जानकारी देता हो.

किसी गोले पर नेविगेट करते समय, हेडिंग किसी तय रेफ़रंस पॉइंट से किसी दिशा के कोण को दिखाती है. आम तौर पर, यह रेफ़रंस पॉइंट 'ट्रू नॉर्थ' होता है. Google Maps API में, किसी हेडिंग को डिग्री में, 'सही उत्तर' से तय किया जाता है. यहां हेडिंग को 'सही उत्तर' (0 डिग्री) से, घड़ी की सुई के घूमने की दिशा में मेज़र किया जाता है. computeHeading() तरीके का इस्तेमाल करके, दो जगहों के बीच के हेडिंग का हिसाब लगाया जा सकता है. इसके लिए, दो from और to LatLng ऑब्जेक्ट पास करें.

किसी खास हेडिंग, ऑरिजिन लोकेशन, और यात्रा की दूरी (मीटर में) के आधार पर, computeOffset() का इस्तेमाल करके डेस्टिनेशन के निर्देशांक का हिसाब लगाया जा सकता है.

दो LatLng ऑब्जेक्ट और 0 से 1 के बीच की वैल्यू दिए जाने पर, interpolate() तरीके का इस्तेमाल करके, उनके बीच के डेस्टिनेशन का हिसाब भी लगाया जा सकता है. यह तरीका, दो जगहों के बीच गोलाकार लीनियर इंटरपोलेशन करता है. इसमें वैल्यू से पता चलता है कि ऑरिजिन से डेस्टिनेशन तक के पाथ पर, कितनी दूरी तय की गई है.

नीचे दिए गए उदाहरण में, मैप पर दो पॉइंट पर क्लिक करने पर दो पॉलीलाइन बनाई गई हैं. इनमें से एक पॉलीलाइन, दो जगहों को जोड़ने वाली जियोडेसिक लाइन है और दूसरी "सीधी" लाइन है. साथ ही, इन दो पॉइंट के बीच यात्रा करने के लिए हेडिंग का हिसाब लगाया गया है:

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;
उदाहरण देखें

सैंपल आज़माएं

वीडियो को कोड में बदलने के तरीके

Maps JavaScript API में पाथ को अक्सर LatLng ऑब्जेक्ट के Array के तौर पर बताया जाता है. हालांकि, अक्सर इस तरह के कलेक्शन को पास करना मुश्किल होता है. इसके बजाय, किसी पाथ को कंप्रेस करने के लिए, Google के पॉलीलाइन एन्कोडिंग एल्गोरिदम का इस्तेमाल किया जा सकता है. बाद में, डिकोडिंग की मदद से इस पाथ को डिकंप्रेस किया जा सकता है.

geometry लाइब्रेरी में, पॉलीलाइन को कोड में बदलने और डिकोड करने के लिए, encoding नेमस्पेस होता है.

स्टैटिक तरीका encodePath(), दिए गए पाथ को कोड में बदल देता है. LatLngs का ऐरे या MVCArray (जो Polyline.getPath() से दिखाया जाता है) पास किया जा सकता है.

एन्क्रिप्ट किए गए पाथ को डिकोड करने के लिए, एन्क्रिप्ट की गई स्ट्रिंग को पैरामीटर के तौर पर पास करके, decodePath() को कॉल करें.

इस उदाहरण में, मिसिसिपी के ऑक्सफ़ोर्ड का मैप दिखाया गया है. मैप पर क्लिक करने से, पॉलीलाइन में एक पॉइंट जुड़ जाता है. पॉलीलाइन बनने के बाद, उसका कोड नीचे दिखता है.

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;
उदाहरण देखें

सैंपल आज़माएं

पॉलीगॉन और पॉलीलाइन फ़ंक्शन

ज्यामिति लाइब्रेरी के poly नेमस्पेस में, काम के फ़ंक्शन होते हैं. इनसे यह पता चलता है कि कोई पॉइंट, पॉलीगॉन या पॉलीलाइन के अंदर है या उसके आस-पास है.

containsLocation()

containsLocation(point:LatLng, polygon:Polygon)

यह पता करने के लिए कि कोई पॉइंट पॉलीगॉन में आता है या नहीं, पॉइंट और पॉलीगॉन को google.maps.geometry.poly.containsLocation() में पास करें. अगर बिंदु, पॉलीगॉन के अंदर या उसके किनारे पर है, तो ये फ़ंक्शन 'सही' दिखाते हैं.

अगर उपयोगकर्ता का क्लिक, तय किए गए ट्राएंगल में आता है, तो नीचे दिया गया कोड ब्राउज़र कंसोल में 'सही' लिखता है. अगर ऐसा नहीं होता है, तो यह 'गलत' लिखता है.

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);

इस कोड के दूसरे वर्शन में, अगर क्लिक बरमूडा ट्रैंगल में आता है, तो मैप पर नीला ट्राएंगल दिखता है. अगर क्लिक बरमूडा ट्रैंगल में नहीं आता है, तो मैप पर लाल रंग का सर्कल दिखता है:

उदाहरण देखें

isLocationOnEdge()

isLocationOnEdge(point:LatLng, poly:Polygon|Polyline, tolerance?:number)

यह पता लगाने के लिए कि कोई पॉइंट किसी पॉलीलाइन पर या उसके आस-पास है या किसी पॉलीगॉन के किनारे पर या उसके आस-पास है, google.maps.geometry.poly.isLocationOnEdge() को पॉइंट, पॉलीलाइन/पॉलीगॉन, और डिग्री में वैल्यू के तौर पर सहनशीलता दें. अगर बिंदु और लाइन या किनारे के सबसे नज़दीक बिंदु के बीच की दूरी, तय की गई सीमा के अंदर है, तो फ़ंक्शन सही वैल्यू दिखाता है. डिफ़ॉल्ट टोलरेंस की वैल्यू 10-9 डिग्री होती है.

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);