شعار زيفيرنت

كيفية استخدام Node Streams لتحويل أكبر قاعدة بيانات POI

التاريخ:

صورة

صورة الملف الشخصي لـ Kuwala Hacker Noon

@كوالاكوالا

كوالا هو إطار عمل مفتوح المصدر لتكامل بيانات الطرف الثالث

أوبن ستريت ماب (OSM) ربما يكون مشروع البيانات المفتوحة الأكثر شمولاً للبيانات الجغرافية. يحتوي على معلومات غنية عن نقاط الاهتمام (POIs) ، مثل الشقق أو المتاجر أو المكاتب ، على مستوى العالم. يمكنك حقًا تسميتها كنز بيانات. أيضًا ، أدرك اللاعبون الكبار ، مثل Apple و Amazon و Facebook ، ذلك وبنوا بشكل كبير على مشروع المجتمع العالمي هذا (مرئي بواسطة: جينينغز أندرسون حالة الخريطة)

صورة

لتمكين فرق علوم البيانات الأصغر من الاستفادة من هذا المورد ، أنشأنا خط أنابيب ETL لتنزيل بيانات OSM الأولية مباشرةً في .pbf تنسيق الملف وتخزين الكائنات المحولة في قاعدة بيانات. الرفع H3 من أوبر الفهرسة ، يمكنك بسهولة الاستعلام عن تلك الكائنات باستخدام استعلامات نصف القطر أو المضلع.

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

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

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

async function downloadFile() { const downloadUrl = await pickFile(); if (!downloadUrl) { throw new Error('No file selected'); } const filePath = `tmp/osmFiles${downloadUrl.split(baseUrl)[1]}`; await fse.ensureDir(filePath.split(filePath.split('/').pop())[0]); const writer = fs.createWriteStream(filePath); const response = await axios.get(downloadUrl, { method: 'GET', responseType: 'stream' }); response.data.pipe(str).pipe(writer); return new Promise((resolve, reject) => { writer.on('finish', () => resolve(filePath)); writer.on('error', reject); });
}

الآن بعد أن قمنا بتنزيل الملف ، دعنا نحلله إلى كائنات يمكن التعامل معها و
اكتبهم في قاعدة بيانات. أولاً ، نقوم بإنشاء دفق قراءة يقرأ ملف
ملف. لتحليل المخزن المؤقت لبروتوكول OSM في كائنات JSON ، نستخدم امتداد
محلل osm-pbf حزمة npm. باستخدام أمر التوجيه ، يمكنك توصيل دفق قابل للكتابة بتدفق قابل للقراءة. هناك فئة معينة ، تيار التحويل ، والتي تنفذ كلاً من الواجهة القابلة للقراءة والكتابة. باستخدام ذلك ، يمكننا تقسيم التصفية والتحويل بالكامل إلى تدفقات دلالية وتوصيلها معًا.

بعد تحليل ملف PBF بتنسيق JSON ، نريد إنشاء كائنات أكثر إيجازًا استنادًا إلى علامات OSM ، وهي مجرد قائمة من أزواج القيمة الرئيسية. يتم ترتيب الكائنات الموجودة في ملف OSM حسب النوع. العقد الأولى ، ثم الطرق ، وأخيراً العلاقات. وهو أمر منطقي للغاية لأن الطرق تتكون من عقد وتتكون العلاقات من طرق. لذلك مع أول محول لدينا ، نقوم بتخزين جميع العقد في قاعدة بيانات مؤقتة. نحن نستخدم المستوىDB هنا ، متجر سريع للقيمة الرئيسية طورته Google. ثانيًا ، نقوم بتصفية جميع الكائنات التي لا تحتوي على علامات ذات صلة لتصنيفها على أنها نقطة مهمة ، على سبيل المثال ، العقد الموجودة فقط لتمثيل نقطة في أثر المبنى. ثالثًا ، نقوم بإنشاء بصمات بناء للطرق والعلاقات ، مثل مخطط المبنى ، على سبيل المثال. في كائنات OSM ، فقط الإشارات إلى العقد التي تشكل المبنى
البصمة المخزنة. نقوم باسترداد العقد ذات الصلة من LevelDB
وإنشاء الأشكال الهندسية بتنسيق GeoJSON. بعد ذلك ، نحصل على النقطه الوسطى
بناءً على هذه الأشكال الهندسية ، والتي نحولها بعد ذلك إلى فهارس H3 باستخدام
محول آخر.

async function parseFile(file) { return new Promise(async (resolve, reject) => { const levelDbPath = 'tmp/levelDb'; try { const db = await level(levelDbPath); const pbfParserStream = parseOSM(); const stream = fs.createReadStream(file); stream .pipe(pbfParserStream) // Parse pbf format to JSON objects .pipe(levelDbStream(db)) // Store every node in temporary database to generate building footprints .pipe(tagFilterStream) // Filter irrelevant items .pipe(buildingFootprintStream(db)) // Construct building footprints for ways and relations .pipe(locationStream) // Get lat lng pair for center based on point or building footprint .pipe(h3Stream) // Convert location to h3 index .pipe(tagStream) // Convert relevant tags into categories and properties .pipe(modelStream) // Create model objects .pipe(mongodbStream(bar)) // Save objects to mongodb .on('finish', async () => { await Poi.insertMany(pois).catch(reject); addedObjects += pois.length; await db.close(); rimraf.sync(levelDbPath); addUnmatchedTags(); // Add unmatched category tags to category list under "misc" resolve(); }) .on('error', (error) => { rimraf.sync(levelDbPath); // Delete temporary database reject(error); }); } catch (error) { rimraf.sync(levelDbPath); // Delete temporary database reject(error); } });
}

H3 هو فهرس مكاني تم تطويره بواسطة Uber ، وهو طريقة رائعة لربط العديد من مصادر البيانات الجغرافية المكانية لأنه يمكنك الانتقال بسرعة من دقة إلى أخرى. نقوم بتجميع العلامات ذات الصلة بخصائص POI مثل الفئات أو العناوين أو تفاصيل الاتصال في أنبوبنا التالي. أخيرًا ، يتم تغليف الكائنات المحولة في كائنات Mongoose للتحقق من صحة المخطط وحتى نتمكن من كتابتها في قاعدة البيانات في الأنبوب الأخير.

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

At كوالا، نريد توحيد البيانات الجغرافية المكانية وجعلها قابلة للتكامل والاتصال بسهولة. لتحقيق تأثير كبير ، نحن مفتوحون تمامًا ونؤمن بقوة المجتمع. إذا كنت تعمل مع البيانات ، فتأكد من تمييزنا بنجمة GitHub جيثب: و الانضمام مجتمع Slack الخاص بنا.

تم النشر أيضًا في: https://medium.com/kuwala-io/using-node-streams-to-transform-the-largest-poi-database-37218f28c996

علامات

انضم إلى Hacker Noon

قم بإنشاء حسابك المجاني لفتح تجربة القراءة المخصصة الخاصة بك.

كوينسمارت. Beste Bitcoin-Börse في أوروبا
المصدر: https://hackernoon.com/how-to-use-node-streams-to-transform-the-largest-poi-database-km1s37np؟source=rss

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة