نظرة عامة
تعرَّف على كيفية استيراد بيانات 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>
<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 script 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>جارٍ تحميل البيانات
يوضّح لك هذا القسم كيفية تحميل البيانات من النطاق نفسه الذي يتضمّن تطبيقك المستنِد إلى Maps JavaScript API أو من نطاق مختلف.
تحميل البيانات من النطاق نفسه
توفّر طبقة بيانات "خرائط Google" حاوية للبيانات الجغرافية المكانية العشوائية (بما في ذلك GeoJSON). إذا كانت بياناتك في ملف مستضاف على النطاق نفسه
الذي يستضيف تطبيق Maps JavaScript API، يمكنك تحميلها
باستخدام طريقة map.data.loadGeoJson(). يجب أن يكون الملف على النطاق نفسه،
ولكن يمكنك استضافته في نطاق فرعي
مختلف. على سبيل المثال، يمكنك إرسال طلب إلى files.example.com من www.example.com.
map.data.loadGeoJson('data.json');
تحميل البيانات على مستوى النطاقات
يمكنك أيضًا طلب بيانات من نطاق آخر غير نطاقك، إذا كانت إعدادات النطاق تسمح بهذا الطلب. يُطلق على المعيار الخاص بهذا الإذن اسم مشاركة الموارد المتعدّدة المصادر (CORS). إذا كان النطاق يسمح بالطلبات من نطاقات أخرى، يجب أن يتضمّن عنوان الاستجابة الإقرار التالي:
Access-Control-Allow-Origin: *
استخدِم أدوات مطوّري برامج Chrome لمعرفة ما إذا كان النطاق قد فعّل سياسة مشاركة الموارد المتعدّدة المصادر (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
يتطلّب الإجراء map.data.addGeoJson() عنصر GeoJSON Feature أو FeatureCollection تم تحليله. ولا تقبل كائنات GeoJSON الهندسية المستقلة (Point أو MultiPoint أو LineString أو MultiLineString أو Polygon أو MultiPolygon أو GeometryCollection) مباشرةً.
إذا كان مصدر البيانات أو الردّ من واجهة برمجة التطبيقات يعرض عنصرًا هندسيًا مستقلاً من GeoJSON بدون برنامج تضمين "type": "Feature" على المستوى الأعلى، يجب تضمينه في عنصر Feature قبل طلب map.data.addGeoJson().
على سبيل المثال، إذا كانت الهندسة (مثل Polygon) عبارة عن كائن JavaScript تم تحليله، يمكنك تضمينه في كائن Feature:
const polygonGeometry = {
type: "Polygon",
coordinates: [
[
[-78.45, 35.82],
[-78.41, 35.73],
[-78.28, 35.66],
[-78.45, 35.82],
],
],
};
const geoJsonFeature = {
type: "Feature",
geometry: polygonGeometry,
};
map.data.addGeoJson(geoJsonFeature);
إذا تم عرض الشكل الهندسي كسلسلة بتنسيق JSON (على سبيل المثال،
حقل polygon الذي يعرضه تنبيه الطقس أو استجابة الحدود)، يمكنك أيضًا
إضافة عنوان في البداية وتذييل في النهاية لتشكيل ملف GeoJSON Feature صالح قبل
تحليله باستخدام JSON.parse():
const geojson_header = "{\"type\":\"Feature\", \"geometry\": ";
const geojson_footer = "}";
map.data.addGeoJson(
JSON.parse(geojson_header + polygon + geojson_footer));
لمزيد من المعلومات حول التعامل مع الأشكال الهندسية والمضلّعات في طبقة البيانات، يُرجى الاطّلاع على دليل مطوّري طبقة البيانات.
تصميم البيانات
يمكنك تغيير مظهر بياناتك عن طريق إضافة بيانات GeoJSON إلى عنصر خريطة. يمكنك قراءة دليل المطوّر للحصول على مزيد من المعلومات حول تصميم بياناتك.
مزيد من المعلومات
- GeoJSON هو تنسيق مفتوح يُستخدم على نطاق واسع لترميز البيانات الجغرافية، ويستند إلى JSON (JavaScript Object Notation). تعمل أدوات وأساليب JavaScript المصممة لبيانات JSON أيضًا مع GeoJSON. يمكنك الاطّلاع على دليل المطوّر لمزيد من المعلومات.
- يرمز JSONP إلى JSON المُضاف إليه عناصر. وهي طريقة اتصال تُستخدَم في برامج JavaScript التي تعمل في متصفّحات الويب لطلب البيانات من خادم في نطاق مختلف.