استيراد البيانات إلى "خرائط Google"

نظرة عامة

تعرَّف على كيفية استيراد بيانات GeoJSON من مصدر محلي أو عن بُعد وعرضها على خريطتك. يستخدم هذا البرنامج التعليمي الخريطة أدناه لتوضيح أساليب مختلفة لاستيراد البيانات إلى الخرائط.

يعرض القسم أدناه الرمز الكامل الذي تحتاجه لإنشاء الخريطة في هذا البرنامج التعليمي.

TypeScript

let map: google.maps.Map;

function initMap(): void {
  map = new google.maps.Map(document.getElementById("map") as HTMLElement, {
    zoom: 2,
    center: new google.maps.LatLng(2.8, -187.3),
    mapTypeId: "terrain",
  });

  // Create a <script> tag and set the USGS URL as the source.
  const script = document.createElement("script");

  // This example uses a local copy of the GeoJSON stored at
  // http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojsonp
  script.src =
    "https://developers.google.com/maps/documentation/javascript/examples/json/earthquake_GeoJSONP.js";
  document.getElementsByTagName("head")[0].appendChild(script);
}

// Loop through the results array and place a marker for each
// set of coordinates.
const eqfeed_callback = function (results: any) {
  for (let i = 0; i < results.features.length; i++) {
    const coords = results.features[i].geometry.coordinates;
    const latLng = new google.maps.LatLng(coords[1], coords[0]);

    new google.maps.Marker({
      position: latLng,
      map: map,
    });
  }
};

declare global {
  interface Window {
    initMap: () => void;
    eqfeed_callback: (results: any) => void;
  }
}
window.initMap = initMap;
window.eqfeed_callback = eqfeed_callback;

JavaScript

let map;

function initMap() {
  map = new google.maps.Map(document.getElementById("map"), {
    zoom: 2,
    center: new google.maps.LatLng(2.8, -187.3),
    mapTypeId: "terrain",
  });

  // Create a <script> tag and set the USGS URL as the source.
  const script = document.createElement("script");

  // This example uses a local copy of the GeoJSON stored at
  // http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojsonp
  script.src =
    "https://developers.google.com/maps/documentation/javascript/examples/json/earthquake_GeoJSONP.js";
  document.getElementsByTagName("head")[0].appendChild(script);
}

// Loop through the results array and place a marker for each
// set of coordinates.
const eqfeed_callback = function (results) {
  for (let i = 0; i < results.features.length; i++) {
    const coords = results.features[i].geometry.coordinates;
    const latLng = new google.maps.LatLng(coords[1], coords[0]);

    new google.maps.Marker({
      position: latLng,
      map: map,
    });
  }
};

window.initMap = initMap;
window.eqfeed_callback = eqfeed_callback;

CSS

/* 
 * Always set the map height explicitly to define the size of the div element
 * that contains the map. 
 */
#map {
  height: 100%;
}

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}

HTML

<html>
  <head>
    <title>Earthquake Markers</title>
    <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>

    <link rel="stylesheet" type="text/css" href="./style.css" />
    <script type="module" src="./index.js"></script>
  </head>
  <body>
    <div id="map"></div>

    <!-- 
      The `defer` attribute causes the callback to execute after the full HTML
      document has been parsed. For non-blocking uses, avoiding race conditions,
      and consistent behavior across browsers, consider loading using Promises.
      See https://developers.google.com/maps/documentation/javascript/load-maps-js-api
      for more information.
      -->
    <script
      src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=initMap&v=weekly"
      defer
    ></script>
  </body>
</html>

تجربة النموذج

جارٍ تحميل البيانات

يوضِّح لك هذا القسم كيفية تحميل البيانات من النطاق نفسه المُستخدَم في تطبيق "واجهة برمجة تطبيقات JavaScript للخرائط" أو من نطاق مختلف.

تحميل البيانات من النطاق نفسه

توفر طبقة بيانات "خرائط Google" حاوية للبيانات الجغرافية المكانية العشوائية (بما في ذلك GeoJSON). إذا كانت بياناتك موضوعة في ملف مُستضاف على النطاق نفسه الذي يتضمّن تطبيق "واجهة برمجة تطبيقات JavaScript للخرائط"، يمكنك تحميله باستخدام طريقة map.data.loadGeoJson(). يجب أن يكون الملف على نفس النطاق، ولكن يمكنك استضافته في نطاق فرعي مختلف. على سبيل المثال، يمكنك تقديم طلب إلى files.example.com من www.example.com.

map.data.loadGeoJson('data.json');

تحميل البيانات عبر النطاقات

يمكنك أيضًا طلب البيانات من نطاق آخر غير نطاقك، إذا كانت إعدادات النطاق تسمح بهذا الطلب. ويُسمّى المعيار القياسي لهذا الإذن مشاركة الموارد المتعدّدة المصادر (CORS). إذا سمح أحد النطاقات بإجراء طلبات عبر النطاقات، يجب أن يتضمن عنوان الاستجابة البيان التالي:

Access-Control-Allow-Origin: *

استخدِم أدوات مطوّري برامج Chrome (DevTools) لمعرفة ما إذا كان النطاق قد فعَّل سياسة CORS أم لا.

تحميل البيانات من هذا النطاق يشبه تحميل JSON من نفس النطاق:

map.data.loadGeoJson('http://www.CORS-ENABLED-SITE.com/data.json');

طلب JSONP

يجب أن يدعم النطاق المستهدف طلبات JSONP لاستخدام هذا الأسلوب.

لطلب JSONP، استخدِم createElement() لإضافة علامة script إلى عنوان المستند.

var script = document.createElement('script');
script.src = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojsonp';
document.getElementsByTagName('head')[0].appendChild(script);

عند تشغيل النص البرمجي، يمرّر النطاق الهدف البيانات كوسيطة إلى نص برمجي آخر، يُسمى عادةً callback(). يحدد النطاق الهدف اسم النص البرمجي لمعاودة الاتصال، وهو الاسم الأول في الصفحة عند تحميل عنوان URL المستهدف في أحد المتصفحات.

على سبيل المثال، يجب تحميل http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojsonp في نافذة المتصفّح لإظهار اسم معاودة الاتصال على أنّه eqfeed_callback.

يجب تحديد النص البرمجي لمعاودة الاتصال في الرمز:

function eqfeed_callback(response) {
  map.data.addGeoJson(response);
}

يمكنك استخدام طريقة addGeoJson() لوضع بيانات GeoJSON التي تم تحليلها على الخريطة.

تصميم البيانات

يمكنك تغيير مظهر بياناتك عن طريق إضافة بيانات GeoJSON إلى كائن خريطة. اقرأ دليل المطوِّر للحصول على مزيد من المعلومات حول تصميم البيانات.

مزيد من المعلومات

  • GeoJSON هو تنسيق مفتوح الاستخدام على نطاق واسع لترميز البيانات الجغرافية، استنادًا إلى JSON (ترميز كائن JavaScript). تعمل أدوات JavaScript وطرقها المصممة لبيانات JSON مع GeoJSON أيضًا. للحصول على مزيد من المعلومات، اقرأ دليل المطوّر.
  • يشير الاختصار JSONP إلى تنسيق JSON المتوافق. وهي طريقة اتصال تُستخدم في برامج JavaScript التي تعمل في متصفحات الويب لطلب البيانات من خادم في نطاق مختلف.