عندما كنا نستعد لأتمتة عمل الخدمات البلدية المحلية ، لفتنا الانتباه إلى استخدام رسم الخرائط ، والذي وجدنا أنه أداة قوية وفعالة حقًا لحل مجموعة واسعة من المهام. على الخريطة ، يمكنك عرض معلومات محدثة حول موقع الكائنات ، وطرق حركة معدات الحصاد ، والنقل ، وخطة العمل وخريطة الحرارة مع المناطق "الصحية" والمشكلة.
يساعد استخدام رسم الخرائط بشكل عام في تسريع وقت رد الفعل واتخاذ القرار بشأن القضايا العاجلة ، ويبسط عملية التخطيط والتنبؤ ، والأهم من ذلك ، أن جميع المعلومات متوفرة في أكثر الأشكال المرئية.
أثناء العمل مع أحد العملاء ، واجهنا مهمة مثيرة للاهتمام - لحساب عدد العناصر على الخريطة حسب الفئة.
لايجاد
حدد المدينة "الأكثر خضرة" في المقاطعة الفيدرالية المركزية من خلال الجمع بين البيانات التالية: عدد المحلات التجارية وصناديق القمامة والمتنزهات.
معطى
رسم الخرائط. اخترنا OpenStreetMap (يشار إليه فيما يلي باسم OSM ) كنقطة انطلاق لسبب بسيط للغاية - المصدر المفتوح.
القرار
هناك عدة طرق لحل هذه المشكلة. على سبيل المثال ، يمكننا استخدام PostgreSQL للاستعلام عن قاعدة بيانات OSM والحصول على البيانات التي نحتاجها ، أو يمكننا استخدام QGIS ، وهو نظام لإنشاء المعلومات الجغرافية المكانية وتحليلها ونشرها. ومع ذلك ، وجدنا طريقة أكثر أناقة وفعالية - Overpass API .
تعد Overpass API أداة قوية لاستخراج البيانات من قاعدة بيانات OSM بناءً على طلب المستخدم. تم تحسينه للمهام من أي نطاق: من استرداد عدة عناصر من قاعدة بيانات إلى مئات الملايين من الكائنات التي يتم تحديدها وفقًا للطلب في شكل XML أو Overpass QL - نسخة مطورة من Overpass XML. اقرأ المزيد عن Overpass API هنا .لنبدأ من الصفر: أولاً وقبل كل شيء ، تحتاج إلى نشر OSM على الخادم. يتم استخدام Ubuntu كنظام تشغيل على أجهزتنا.
س: لماذا نشر OSM الخاص بك؟
ج: للعمل مع البيانات ، نحتاج إلى واجهة برمجة تطبيقات Overpass ، التي يتمتع خادمها العام بحد أقصى لعدد الطلبات في اليوم. لهذا السبب سنقوم بنشر خادمنا مع OSM
تعليمات مفصلة لتثبيت OSM هنا .الخطوة التالية هي تثبيت Overpass API - يمكن العثور على أحدث إصدار لها هنا .
sudo apt-get update
sudo apt-get install g++ make expat libexpat1-dev zlib1g-dev apache2 -y
wget http://dev.overpass-api.de/releases/osm-3s_.tar.gz
tar -zxvf osm-3s_.tar.gz
cd osm-3s_
./configure CXXFLAGS="-O2" --prefix=$EXEC_DIR
make install
cd ../
chmod -R 755 ./overpass
بعد التثبيت ، سوف تحتاج إلى ملء - إنشاء قاعدة بيانات. لا نحتاج إلى قاعدة بيانات للعالم كله ، لذلك سنستخدم خدمة Geofabrik ، التي تتيح لنا الحصول على البيانات الخاصة بالمناطق الإدارية المحددة.
وثمة بديل جدير Geofabrik هو BBBike .
نقوم بتنزيل وفك ضغط قاعدة البيانات التي تم تنزيلها من أوروبا> الاتحاد الروسي> دليل المقاطعة الفيدرالية المركزية بتنسيق .osm.bz2 ، على النحو التالي:
PATH_TO_INIT_OSM3S.SH PATH_TO_FILE_BZ2 PATH_WERE_Unpack_OVERPASS_API DIRECTORY
ملاحظة: في هذه الحالة ، يتم تنفيذ كل التصرفات في دليل التجاوز .
لذا ، أصبحت المنصة جاهزة تقريبًا - الآن يمكننا تقديم طلبنا الأول ومعرفة عدد الحدائق في المنطقة بأكملها.
PATH_TO_OSM3S_QUERY --db-dir = PATH_TO_DB
يبدو طلبنا واستجابتنا كما يلي:
root@MIP-USER55:~# cd overpass/
root@MIP-USER55:~/overpass# ./osm-3s_v0.7.56.7/bin/osm3s_query --db-dir=db
encoding remark: Please enter your query and terminate it with CTRL+D.
[out:json][timeout:25];
(
nwr["landuse"="forest"];
);
out count;
{
...,
"elements": [
{
"type": "count",
"id": 0,
"tags": {
"nodes": "23",
"ways": "19723",
"relations": "4206",
"total": "23952"
}
}
]
}
نحن قريبون بالفعل: كل ما تبقى هو تقسيم المتنزهات حسب المناطق والمدن. سيساعدنا المرسل الذي يعمل بشكل منفصل ويعمل باستمرار على التعامل مع هذه المهمة .
أطلقنا واجهة برمجة التطبيقات وأضفنا " منفذ الاستماع" في الدليل /etc/apache2/ports.conf .
echo "_ localhost" | sudo tee /etc/apache2/conf-available/_.conf && sudo a2enconf _
sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT
sudo a2enmod cgi
sudo a2enmod ext_filter
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/___.conf
التحقق من التكوين. يجب أن تبدو هذه.
<VirtualHost *:>
ServerAdmin webmaster@localhost
ExtFilterDefine gzip mode=output cmd=/bin/gzip
DocumentRoot __OVERPASS_API/html
ScriptAlias /api/ __OVERPASS_API/cgi-bin/
<Directory "__OVERPASS_API">
AllowOverride None
Options Indexes FollowSymLinks
Require all granted
</Directory>
<Directory "__OVERPASS_API/cgi-bin/">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
بعد ذلك ، نقوم بتشغيل المضيف الجديد وإرسال المضيف القديم للراحة.
sudo a2ensite .conf
sudo a2dissite 000-default.conf
sudo a2dissite __.conf
sudo service apache2 reload
حان الوقت الآن لتمكين المرسل الأول الذي سيتعامل مع طلباتنا. للقيام بذلك ، سوف نستخدم الأمر.
nohup __OVERPASS_API/bin/dispatcher --osm-base --db-dir=__DB --meta &
أول علامة على أن كل شيء
سار وفقًا للخطة هو إنشاء ملف osm3s_OVERPASS_API_VERSION_osm_base في دليل قاعدة البيانات. يعرض ملف nohup.out رسالة حالة المرسل - المرسل بدأ للتو .
ومع ذلك ، لا ينتهي العمل عند هذا الحد: فأنت بحاجة إلى بدء مرسل آخر. أولاً ، انسخ مجلد القواعد إلى الدليل بقاعدة البيانات ووزع الحقوق على osm3s_OVERPASS_API_VERSION_areas الناتج .
nohup __OVERPASS_API/bin/dispatcher --areas --db-dir=__DB &
chmod 666 "../db/osm3s_OVERPASS_API__areas"
nohup __OVERPASS_API/bin/rules_loop.sh __DB &
الآن يمكننا تقديم طلب للمنطقة وحساب عدد الحدائق في ريازان. وبالمناسبة ، هذا يعمل بالفعل في شريط عنوان المتصفح.
http://localhost:/api/interpreter?data=[output:json][timeout:25]; area[name=""]->.searchArea; ( nwr["leisure"="park"](area.searchArea); ); out count;
الجواب الذي طال انتظاره!
"elements": [
{
"type": "count",
"id": 0,
"tags": {
"nodes": "0",
"ways": "57",
"relations": "11",
"areas": "0",
"total": "68"
}
}
]
}
لذا ، يمكننا الآن الغوص في قضايا التحليلات والتحسين: سنجد عدد المتنزهات والمتاجر وعلب القمامة في 25 مدينة رئيسية في المنطقة الفيدرالية المركزية ومقارنة هذه المؤشرات باستخدام الأدوات التحليلية لمنصة ODANT .
ODANT هي منصة تكامل رقمية روسية الصنع مصممة لبناء أنظمة معلومات مختلفة التعقيد والتوزيع. اقرأ المزيد عن ODANT هنا .هكذا تبدو معاييرنا للبحث عن حاويات النفايات: في إطار عمل المهمة ، لا نفرق بين مواقع الحاويات ، وحاويات النفايات القائمة بذاتها ، ونقاط تجميع النفايات الصلبة.
nwr["amenity"="recycling"](area.searchArea);
nwr["amenity"="waste_disposal"](area.searchArea);
nwr["amenity"="waste_basket"](area.searchArea);
قمنا بتصدير المخرجات من ODANT كطاولة مسطحة.
مدينة |
الجرار |
تعداد السكان |
السكان / الجرار |
فلاديمير |
1525 |
356937 |
234 |
كراسنوجورسك |
274 |
175554 |
641 |
كالوغا |
376 |
332039 |
883 |
تامبوف |
279 |
292140 |
1047 |
موسكو |
11473 |
12678079 |
1105 |
كولومنا |
111 |
140129 |
1262 |
بلاشيخة |
378 |
507366 |
1342 |
كورسك |
336 |
452976 |
1348 |
ريبينسك |
129 |
184635 |
1431 |
Mytishchi |
140 |
235504 |
1682 |
يوبيرتسي |
119 |
205295 |
1725 |
زيلينوجراد |
140 |
250453 |
1789 |
فورونيج |
544 |
1058261 |
1945 |
تفير |
225 |
449507 |
1998 |
ياروسلافل |
273 |
608353 |
2228 |
موروم |
43 |
106984 |
2488 |
بودولسك |
114 |
308130 |
2703 |
خيمكي |
89 |
259550 |
2916 |
كوستروما |
72 |
276929 |
3846 |
ليبيتسك |
124 |
509420 |
4108 |
ريازان |
118 |
539290 |
4570 |
كوروليف |
49 |
224348 |
4579 |
تولا |
101 |
475161 |
4705 |
إليكتروستال |
32 |
156026 |
4876 |
في هذا التصنيف ، تحتل مدينة فلاديمير المرتبة الأولى المشرفة: يوجد 234 شخصًا فقط في مكان واحد لتراكم القمامة. باستخدام أدوات ODANT المدمجة ، قمنا ببناء مخططين مسليين.
دعنا ننتقل إلى العنصر التالي - المقاعد.
nwr["amenity"="bench"](area.searchArea);
نحصل على النتيجة التالية في شكل جدول.
مدينة |
مقاعد |
تعداد السكان |
السكان / المحلات |
فلاديمير |
593 |
356937 |
602 |
تامبوف |
413 |
292140 |
707 |
موسكو |
13970 |
12678079 |
908 |
كراسنوجورسك |
143 |
175554 |
1228 |
بلاشيخة |
411 |
507366 |
1234 |
زيلينوجراد |
185 |
250453 |
1354 |
تفير |
268 |
449507 |
1677 |
يوبيرتسي |
115 |
205295 |
1785 |
كالوغا |
176 |
332039 |
1887 |
كورسك |
214 |
452976 |
2117 |
موروم |
42 |
106984 |
2547 |
|
|
172 |
475161 |
2763 |
|
|
49 |
140129 |
2860 |
|
|
272 |
848752 |
3120 |
|
|
79 |
308130 |
3900 |
|
|
132 |
539290 |
4086 |
|
|
61 |
276929 |
4540 |
|
|
43 |
259550 |
6036 |
|
|
25 |
184635 |
7385 |
|
|
78 |
608353 |
7799 |
|
|
55 |
509420 |
9262 |
|
|
16 |
156026 |
9752 |
|
|
23 |
224348 |
9754 |
|
|
17 |
235504 |
13853 |
ومرة أخرى ، تبين أن فلاديمير هو الأكثر راحة بين جميع المتنافسين: لن يكون من الممكن وضع 602 شخصًا على مقعد واحد ، ولكن في Mytishchi ، هناك صراع شرس يجري على أماكن. ومع ذلك ، يمكنك دائمًا وضع جدول زمني.
نحن نتخيل نتائجنا.
دعنا ننتقل إلى الجزء الأكثر إثارة للاهتمام: حساب مساحة الحدائق. يمكننا استخدام عدة طرق لحل هذه المشكلة ، لكن أكثر المصادر المفتوحة والأكثر روعة التي نجدها هي مكتبة Leaflet . في الاستعلام نفسه ، تحتاج إلى استبدال out count مع out geom ، مما سيعطينا إحداثيات المناطق.
Leaflet هي مكتبة JavaScript مفتوحة المصدر لعرض الخرائط على مواقع الويب. يدعم معظم الأنظمة الأساسية للجوال وسطح المكتب التي تدعم HTML5 و CSS3. يسمح Leaflet للمطور غير المألوف بنظم المعلومات الجغرافية بعرض الخرائط النقطية بسهولة المكونة من مربعات صغيرة ، ربما مع طبقات إضافية متراكبة فوق المستوى الرئيسي. اقرأ المزيد عن الكتيب هنا .
لنقم بإنشاء مضلع.
const polygon = L.polygon().addTo(map);
const area = L.GeometryUtil.geodesicArea(polygon.getLatLngs());
الآن تحتوي المنطقة على مساحة المنطقة بالمتر المربع. نقوم باستخراج البيانات الخاصة بالمدن التي اخترناها ونحصل على الجدول التالي.
مدينة |
إجمالي مساحة الحديقة (كم 2) |
مساحة المدينة (كم 2) |
نسبة المساحة التي تشغلها الحدائق |
الكمية الحدائق |
زيلينوجراد |
4.13 |
37.199 |
0.111 |
26 |
كالوغا |
12.60 |
168.8 |
0.075 |
140 |
موسكو |
121.75 |
2561.5 |
0.048 |
1469 |
يوبيرتسي |
0.60 |
12.87 |
0.047 |
28 |
فلاديمير |
4.62 |
137.14 |
0.034 |
104 |
خيمكي |
3.55 |
109.8 |
0.032 |
27 |
بودولسك |
1.29 |
40.39 |
0.032 |
53 |
بلاشيخة |
1.78 |
62.8 |
0.028 |
55 |
تامبوف |
2.71 |
96.58 |
0.028 |
140 |
تولا |
4.09 |
145.8 |
0.028 |
102 |
كوستروما |
3.95 |
144.5 |
0.027 |
50 |
كراسنوجورسك |
0.69 |
25.65 |
0.027 |
21 |
ريازان |
4.32 |
224.163 |
0.019 |
96 |
ياروسلافل |
3.68 |
205.8 |
0.018 |
176 |
كوروليف |
0.97 |
55.47 |
0.017 |
ثلاثين |
كورسك |
3.31 |
208.2 |
0.016 |
862 |
كولومنا |
1.03 |
65.1 |
0.016 |
21 |
Mytishchi |
0.53 |
34.59 |
0.015 |
ثلاثين |
فورونيج |
8.25 |
596.51 |
0.014 |
414 |
ليبيتسك |
4.44 |
330.15 |
0.013 |
78 |
تفير |
1.38 |
152.22 |
0.009 |
129 |
موروم |
0.33 |
43.78 |
0.008 |
أحد عشر |
ريبينسك |
0.65 |
101.42 |
0.006 |
62 |
إليكتروستال |
0.25 |
51.45 |
0.005 |
52 |
وفقًا لـ OSM ، فإن Zelenograd تبرر اسمها تمامًا - 11 ٪ من مساحة المدينة تشغلها مناطق خضراء. دعنا نحصل على نسبة عدد السكان إلى عدد الحدائق.
مدينة |
إجمالي مساحة الحديقة (م 2) |
عدد الحدائق المتر المربع لكل ساكن |
عدد السكان لكل حديقة |
كالوغا |
12600000 |
37.95 |
2372 |
زيلينوجراد |
4،130،000 |
16.49 |
9633 |
كوستروما |
3،950،000 |
14.26 |
5539 |
خيمكي |
3.550.000 |
13.68 |
9613 |
فلاديمير |
4،620،000 |
12.94 |
3432 |
فورونيج |
8،250،000 |
9.72 |
2050 |
موسكو |
121.750.000 |
9.60 |
8630 |
تامبوف |
2،710،000 |
9.28 |
2087 |
ليبيتسك |
4،440،000 |
8.72 |
6531 |
تولا |
4،090،000 |
8.61 |
4658 |
ريازان |
4،320،000 |
8.01 |
5618 |
كولومنا |
1،030،000 |
7.35 |
6673 |
كورسك |
3،310،000 |
7.31 |
525 |
ياروسلافل |
3،680،000 |
6.05 |
3457 |
كوروليف |
970.000 |
4.32 |
7478 |
بودولسك |
1،290،000 |
4.19 |
5814 |
كراسنوجورسك |
690000 |
3.93 |
8360 |
ريبينسك |
650.000 |
3.52 |
2978 |
بلاشيخة |
1،780،000 |
3.51 |
9225 |
موروم |
330،000 |
3.08 |
9726 |
تفير |
1،380،000 |
3.07 |
3485 |
يوبيرتسي |
600000 |
2.92 |
7332 |
Mytishchi |
530.000 |
2.25 |
7850 |
إليكتروستال |
250000 |
1.60 |
3001 |
دعنا نقدم البيانات في شكل رسوم بيانية.
وفي النهاية - تصنيف المدن ، محسوبًا بالأماكن المشغولة.
مدينة |
تقييم |
مكان |
فلاديمير |
12 |
1 |
كالوغا |
خمسة عشر |
2 |
موسكو |
الثامنة عشر |
3 |
زيلينوجراد |
21 |
4 |
تامبوف |
23 |
خمسة |
كراسنوجورسك |
35 |
6 |
بلاشيخة |
39 |
7 |
يوبيرتسي |
45 |
8 |
خيمكي |
46 |
تسع |
كورسك |
47 |
عشرة |
كولومنا |
48 |
أحد عشر |
كوستروما |
50 |
12 |
فورونيج |
52 |
ثلاثة عشر |
بودولسك |
55 |
أربعة عشرة |
تولا |
55 |
خمسة عشر |
ريازان |
61 |
السادس عشر |
تفير |
63 |
17 |
ياروسلافل |
63 |
الثامنة عشر |
موروم |
69 |
19 |
ريبينسك |
69 |
20 |
ليبيتسك |
70 |
21 |
كوروليف |
75 |
22 |
Mytishchi |
75 |
23 |
إليكتروستال |
94 |
24 |
الخاتمة والاستنتاجات
بقرار من لجنة التحكيم المكونة من OpenStreetMap و Overpass API و ODANT ، يحتل
فلاديمير المركز الأول المشرف ويحصل على لقب "الأكثر خضرة في المنطقة الفيدرالية المركزية".
تجدر الإشارة إلى الحقيقة التالية: استند بحثنا فقط إلى البيانات الواردة في OSM. بطبيعة الحال ، يوجد في Mytishchi بضع مئات من المقاعد الإضافية ، وفي تولا توجد أماكن أكثر بكثير لتراكم النفايات. يمكن عرض نتائجنا من الجانب الآخر ، على سبيل المثال ، لتقييم ديناميكيات إضافة كائنات البنية التحتية الحضرية إلى قاعدة بيانات OSM. ومع ذلك ، في المتوسط ، يكون الأشخاص "بطيئين بنفس الدرجة" في إدخال البيانات في OSM ، لذلك يمكننا أن نفترض أن البيانات موثوقة نسبيًا وتستحق التفكير فيها.
تمكنا من حل المشكلة وإيجاد طريقة فعالة للعمل مع الكائنات على خرائط OSM: اتضح أنها مزيج من Overpass API و Leaflet. باستخدام هذه المجموعة من الأدوات ، يمكننا إجراء استعلامات لقاعدة بيانات OSM وتلقي البيانات حول عدد الكائنات وحساب مناطق المناطق. لعرض البيانات والتحليلات ، قمنا بتجميع حل قائم على الويب يعتمد على ODANT والذي يلبي جميع احتياجاتنا
هناك عدد كبير من الصناعات والأعمال والاقتصاد ، والتي يمكن أن يساعدها هذا الحل. إذا كان لديك أي أفكار أو ملاحظات ، فسيكون من الجيد مناقشتها. لقد أمضينا 28 ساعة نظيفة في المهمة ، وقد تتمكن من القيام بذلك بشكل أسرع.
مطور الواجهة الأمامية ، Infostandard - دانيال إيبيفانوف.
محرر Infostandard - نيكيتا موروزوف.