استيراد خريطة الشارع المفتوح. من المصدر الثنائي إلى الجدول في قاعدة البيانات في بضع خطوات

عادةً ، عندما يتحدث شخص ما عن OSM ، تنبثق إحدى خدمات الويب في رأسك ، أو تطبيق مثل Maps.me ، استنادًا إلى بيانات OSM. في الواقع ، فإن مشروع OSM هو البيانات في المقام الأول ، وكل شيء آخر هو في الأساس حالة خاصة لاستخدامها. لا تقدم الخدمات عادة سوى جزء من المعلومات المرسومة وفقًا لقواعدها.

في البداية ، OSM عبارة عن مجموعة من النقاط والروابط بين النقاط والعلامات الخاصة بها. مصادر المجتمع لها تنسيقان. في البداية ، تم استخدام XML كطريقة ذات أولوية لتوزيع البيانات ، لكن ملف Planet.osm في نموذج غير مضغوط تجاوز بالفعل تيرابايت ، ولا أرى أي سبب لاستخدامه لمعلومات ضخمة نسبيًا. يتمتع PBF بميزة كبيرة - إنه ثنائي وملف الأرض بالكامل بحجم 50 جيجابايت تقريبًا (XML مضغوط حوالي 80 جيجابايت).

سيكون حول استيراد بيانات OSM من التنسيق "الأصلي" باستخدام أداة التناضح.

نحتاج أيضًا إلى PostgreSql مع ملحق Postgis ، والذي سنستورد إليه بيانات OSM.

نتيجة لذلك ، من الممكن الحصول على معلومات عن الكائنات ذات العلامات المدرجة هنا في قاعدة البيانات الخاصة بهم .



إعداد DB.


أولاً ، قم بإنشاء قاعدة بيانات في Postgresql ، لا يهم الاسم حقًا.

psql -c "CREATE DATABASE map;" 

بعد ذلك ، أضف الملحقات الضرورية لمزيد من العمل.

 psql -d map -c "CREATE EXTENSION postgis; CREATE EXTENSION hstore; " 

ملحق Postgis "يربط" بقاعدة البيانات الوحدة النمطية الفعلية للعمل مع البيانات الجغرافية (أذكرك أنه يجب عليك تثبيت Postgis نفسه). تم تصميم ملحق hstore للعمل مع مجموعات المفاتيح / القيمة ، كما سيتم تضمين الكثير من المعلومات في علامات OSM.

تحميل التناضح . باختصار ، إنه برنامج لمجموعة واسعة من العمليات مع بيانات OSM. هناك بعض الوثائق الجيدة حول العمل مع سطر الأوامر. المصادر في جاوة. أدناه سوف نستخدم سطر الأوامر. استخدمت أيضًا Osmosis كمكتبة Java ، وكان الكود المصدري (متاحًا على GitHub) واضحًا بدرجة كافية بالنسبة لي ، وكان واجهة برمجة التطبيقات سهلة الاستخدام.

الآن نحن نستعد قاعدة البيانات للاستيراد. يمكن إنشاء الجداول والوظائف الضرورية باستخدام البرامج النصية الموجودة في المجلد osmosis / script. بالإضافة إلى البرنامج النصي الرئيسي ، سنقوم بتنفيذ كود SQL الذي سيخلق مجالًا لتخزين هندسة الخطوط. ويرجع ذلك إلى حقيقة أن بيانات OSM يتم تمثيلها على الأرجح كوصلات نقطة أكثر من كونها مجموعة من الأشكال الهندسية.

 psql -d map -fc:\osmosis\script\pgsnapshot_schema_0.6.sql psql -d map -fc:\osmosis\script\pgsnapshot_schema_0.6_linestring.sql 

استيراد بيانات OSM إلى قاعدة بيانات


حسنا ، الآن كل شيء تقريبا جاهز. يمكنك حتى تشغيل الاستيراد. من الضروري أن نقرر ما الذي سنأخذه كمصدر. وهي تحتاج إلى اختيار الشكل والمصدر. في البداية ، استخدم مجتمع OSM (ويستخدم) تنسيق XML. ولكن حجم البيانات ينمو ويتزايد ، وبالتالي فإن تنسيق النص يتم تدريجياً. استخدام PBF هو أكثر ملاءمة إلى حد ما. المصدر المركزي planet.openstreetmap.org يحتوي على بيانات للعالم بأسره. باستخدام ملف واحد ، يمكنك تنزيل قاعدة المعرفة الكاملة للمشروع ، والتي تجاوزت بالفعل 40 غيغابايت في شكل ثنائي. في تلك الحالات التي أردت فيها قطع جزء من البيانات من هناك ، غادرت الكمبيوتر المحمول يعمل طوال الليل ، مما يوفر له أكثر من 100 جيجابايت من المساحة الحرة على SSD للملفات المؤقتة.

في حالتنا ، يمكننا البدء باستخدام التحميلات من أعضاء المجتمع. هناك موارد تتيح تنزيل البيانات فقط لمنطقة معينة. على سبيل المثال ، download.geofabrik.de . خذ منطقة فورونيج. هناك يتم تضمينه في ملف يحتوي على بيانات للمنطقة الفيدرالية المركزية بأكملها. يمكنك تنزيل central-district-district-latest.osm.pbf ، ثم قص "القطعة" المطلوبة في ملف منفصل أو مرشح عن طريق الإحداثيات عند الاستيراد إلى قاعدة البيانات. أود أن أقترح الخيار الأول:

 c:\osmosis\bin\osmosis.bat --read-pbf file="c:\downloads\central-fed-district-latest.osm.pbf" --bounding-box top=52.059564 left=37.92290 bottom=49.612297 right=43.225858 --write-pbf file="c:\map\voronezh.osm.pbf" 

كل شيء بسيط هنا. نقرأ ملف PBF ، ونرشح نتائج القراءة بواسطة مستطيل الإحداثيات ، ونكتب النتائج بعد التصفية إلى ملف الإخراج. يمكنك التصفية حسب الإحداثيات بدقة أكبر باستخدام ليس مستطيلًا ، ولكن المضلع الذي توجد إحداثياته ​​في ملف منفصل.

ثم يتم استيراد الملف الناتج voronezh.osm.pbf في قاعدة البيانات. للاتصال ، قم بإنشاء ملف خصائص مع معلمات الوصول إلى قاعدة البيانات:

 host=localhost database=map user=pguser password=pgpassword dbType=postgresql 

حسنا ، الاستيراد نفسه:

 c:\osmosis\bin\osmosis.bat --read-pbf c:\map\voronezh.osm.pbf --write-pgsql authFile=c:\map\databaseinfo.properties 

البيانات المستوردة


الآن يمكنك أن تبدأ بالفعل في دراسة ما لدينا في قاعدة البيانات. الفكر الأول هو أن هناك مجموعة من الأرقام ، ولكن هذا ليس صحيحًا تمامًا. كما قلت ، العنصر الرئيسي هو النقطة. يتم إنشاء كل شيء آخر عن طريق إنشاء روابط (علاقات) بين النقاط. لن نتعمق بعد ، خاصة وأن الأيدي تتحكّم بالفعل لإنشاء جدول "مسطح" خاص بها مع بعض البيانات. حسنًا ، بالنسبة للخطوط والنقاط ، كل شيء جاهز ، تحتاج فقط إلى إنشاء جدول مع الحقول اللازمة ، وإدخال الإدخالات اللازمة هناك. وما هي الحقول التي لدينا؟ هنا لمساعدة الويكي. على سبيل المثال ، خذ زوج / مفتاح الطاقة / القيمة = سطر . اختر قائمة الحقول التي سنستخدمها ، على سبيل المثال: الاسم ، الجهد ، المشغل ، الكابلات. اتضح أننا نريد تحديد الخطوط التي تحتوي بالضرورة على خاصية power = line ، جنبًا إلى جنب مع اسم الحقول والجهد والمشغل والكابلات. إنشاء جدول:

 CREATE TABLE power_lines ( name varchar, voltage varchar, operator varchar, cables varchar, geom geometry ) 

وطلب نفسه لملء جدولنا الجديد:

 INSERT INTO power_lines SELECT ways.tags -> 'name' as name, ways.tags -> 'voltage' as voltage, ways.tags -> 'operator' as operator, ways.tags -> 'cables' as cables, ways.linestring as geom FROM ways WHERE ways.tags -> 'power' IN ( 'line' ) 

انتهى الأمر ، لدينا جدول مع خطوط الكهرباء ، حيث تملأ بعض الخطوط حتى بعض الحقول! حسنًا ، يعد الجدول مثيرًا للاهتمام ، ولكن عرض البيانات لعرض الهندسة سيكون أمرًا رائعًا أيضًا. أسرع طريقة للقيام بذلك هي مع QGIS ، إلا أنه يجب أولاً تثبيت هذه GIS القوية. هناك بالفعل نضيف طبقة Postgis ، نستخدم أي خريطة كركيزة (يمكنك استخدام البرنامج المساعد OpenLayers). تكوين ، نظرة:



الصيحة! حتى تشبه إلى حد كبير الحقيقة ، فكرت ، أنظر من النافذة عند خطوط الكهرباء.

والمضلعات؟

الموقف مع النقاط هو نفسه تقريبا ، إلا أنك تحتاج إلى استخدام جدول العقد. KDPV يحتوي فقط على البيانات على المحطات الفرعية . وماذا عن المضلعات؟ تتكون المضلعات أيضًا من خطوط (مغلقة). يبدو أنه يمكنك فقط إغلاق الخطوط والاستمتاع بالنتيجة ، لكنها لن تنجح بهذه الطريقة. هناك العديد من المزالق. يمكن أن تتكون المضلعات من عدة خطوط مغلقة.

على سبيل المثال ، قد تكون الجزيرة على بحيرة. لذلك ، نحصل على "ثقب" في المكب. كان علي أيضًا أن أتعلم معنى كلمة "exclave" (لعاري ، كنت أعرف فقط عن "الجيب"). يتم تجميع المضلعات أيضًا. على سبيل المثال ، قد تتكون الغابة من عدة "قطع". والتي يجب أن تمثل ككائن واحد. لأعلى كل شيء ، يجب علينا قطع المضلعات المفتوحة إذا كانت بعض البيانات خارج الخريطة. لقد حللت هذه ، وبعض المشاكل الأخرى في البرنامج النصي SQL ، والتي وضعت بأمان على الرف بعد أن عملت. تم العثور على مشروع التناضح العكسي على جيثب. على مضض ، قررت أن استخدام هذا الحل يعد خيارًا أفضل من مجموعة النصوص التي كتبت على ركبتي في غضون يومين. نحن نفعل ما يقال في README ، أي أننا ننفذ قائمة البرامج النصية ، ولدينا جدول multolygons ، المليء بالتعليمات من assemble.sql. بعد ملء الجدول بالمضلعات ، يمكنك التوصل إلى ما نريد الحصول عليه. دعنا نختار أراضي الحدائق ؟

ننظر إلى الويكي ونكتب نصًا:

 CREATE TABLE parks ( name varchar, geom geometry ); INSERT INTO parks SELECT m.tags -> 'name' as name, m.geom FROM multipolygons m WHERE m.tags -> 'leisure' IN ( 'park' ) 

الآن نحن تصور:



حسنًا ، لنكون صادقين ، هنا يمكنك الجدال حول أهمية البيانات. ولكن هذا هو موضوع لمناقشة أخرى.

Source: https://habr.com/ru/post/ar467043/


All Articles