जेफिरनेट लोगो

सबसे बड़े POI डेटाबेस को बदलने के लिए नोड स्ट्रीम का उपयोग कैसे करें

दिनांक:

की छवि

कुवाला हैकर दोपहर प्रोफ़ाइल चित्र

@कुवालाकुवाला

कुवाला तृतीय-पक्ष डेटा एकीकरण के लिए एक खुला स्रोत ढांचा है

OpenStreetMap (OSM) जियो-डेटा के लिए शायद सबसे व्यापक ओपन डेटा प्रोजेक्ट है। इसमें विश्व स्तर पर रुचि के स्थानों (पीओआई), जैसे अपार्टमेंट, दुकानों या कार्यालयों के बारे में समृद्ध जानकारी है। आप इसे सही मायने में डेटा का खजाना कह सकते हैं। साथ ही, Apple, Amazon, और Facebook जैसे बड़े खिलाड़ियों ने इसे महसूस किया और इस वैश्विक सामुदायिक परियोजना (Visual by: जेनिंग्स एंडरसन मानचित्र की स्थिति)

की छवि

इस संसाधन से लाभ उठाने के लिए छोटी डेटा विज्ञान टीमों को सक्षम करने के लिए, हमने कच्चे OSM डेटा को सीधे डाउनलोड करने के लिए एक ETL पाइपलाइन बनाई। .पीबीएफ फ़ाइल स्वरूपित करें और रूपांतरित वस्तुओं को डेटाबेस में संग्रहीत करें। इस्तेमाल उबेर का H3 अनुक्रमण, फिर आप उन वस्तुओं को त्रिज्या या बहुभुज प्रश्नों के साथ आसानी से क्वेरी कर सकते हैं।

इस लेख के शेष हिस्सों में, मैं आपको दिखाऊंगा कि कैसे हमने धाराओं की शक्ति का उपयोग करके कच्चे डेटा के परिवर्तन के लिए संपर्क किया Node.js. सभी कोड स्निपेट ओपन-सोर्स हैं, जैसे कुवाला में बाकी सब कुछ। आप इसे पर पा सकते हैं हमारा गिटहब.

स्ट्रीम में Node.js बहुत अधिक मेमोरी का उपयोग न करते हुए बड़ी फ़ाइलों को संसाधित करने का एक शानदार तरीका है। इसका कारण यह है कि डेटा पर ट्रांसफ़ॉर्मेशन या काम करने के लिए आपको पूरी फ़ाइल को मेमोरी में लोड करने की आवश्यकता नहीं है, लेकिन यह उन्हें बैचों में पैक करता है। इस तरह, लाखों पंक्तियों वाली फ़ाइलों पर भी, स्मृति खपत लगातार कम रहती है। बेशक, आपको रूपांतरित डेटा को सीधे डेटाबेस या फ़ाइल सिस्टम में लिखना होगा या बैच में डेटा के आधार पर अनुरोध करना होगा और इंटरमीडिएट इन-मेमोरी ऑब्जेक्ट्स में सब कुछ स्टोर नहीं करना होगा।

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-पार्सर एनपीएम पैकेज। पाइप कमांड से, आप लिखने योग्य स्ट्रीम को पढ़ने योग्य स्ट्रीम से कनेक्ट कर सकते हैं। एक विशेष वर्ग है, ट्रांसफ़ॉर्म स्ट्रीम, जो पठनीय और लिखने योग्य इंटरफ़ेस दोनों को लागू करता है। इसका उपयोग करके, हम संपूर्ण फ़िल्टरिंग और रूपांतरण को सिमेंटिक स्ट्रीम में तोड़ सकते हैं और उन्हें एक साथ जोड़ सकते हैं।

पार्स करने के बाद PBF JSON के प्रारूप में, हम OSM टैग के आधार पर अधिक संक्षिप्त ऑब्जेक्ट बनाना चाहते हैं, जो कि केवल कुंजी-मूल्य जोड़े की एक सूची है। OSM फ़ाइल में ऑब्जेक्ट प्रकार के अनुसार क्रमित होते हैं। पहले नोड्स, फिर तरीके, और अंत में संबंध। जो बहुत मायने रखता है क्योंकि तरीकों में नोड्स होते हैं और संबंधों में तरीके होते हैं। तो हमारे पहले ट्रांसफॉर्मर के साथ, हम सभी नोड्स को एक अस्थायी डेटाबेस में स्टोर करते हैं। हम प्रयोग करते हैं लेवलडीबी यहाँ, 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 उबेर द्वारा विकसित एक स्थानिक सूचकांक है, जो कई भू-स्थानिक डेटा स्रोतों को जोड़ने का एक शानदार तरीका है क्योंकि आप जल्दी से एक संकल्प से दूसरे में जा सकते हैं। हम अपने अगले पाइप में पीओआई गुणों जैसे श्रेणियों, पते, या संपर्क विवरण के लिए प्रासंगिक टैग एकत्र करते हैं। अंत में, रूपांतरित वस्तुओं को स्कीमा को मान्य करने के लिए नेवला वस्तुओं में लपेटा जाता है और ताकि हम उन्हें अंतिम पाइप में डेटाबेस में लिख सकें।

इन परिवर्तनों को पारित करने के बाद, अब हमारे पास आसान वस्तुएं हैं जिन्हें आप या तो अपने डेटा वेयरहाउस में लोड कर सकते हैं या एपीआई पर क्वेरी कर सकते हैं, उदाहरण के लिए, त्रिज्या और ज्यामिति प्रश्न।

At कुवाला, हम भू-स्थानिक डेटा को एकीकृत करना चाहते हैं और उन्हें आसानी से एकीकृत और कनेक्ट करने योग्य बनाना चाहते हैं। एक महत्वपूर्ण प्रभाव डालने के लिए, हम पूरी तरह से खुले स्रोत हैं और समुदाय की शक्ति में विश्वास करते हैं। यदि आप डेटा के साथ काम करते हैं, तो हमें तारांकित करना सुनिश्चित करें GitHub और में शामिल होने हमारा सुस्त समुदाय।

इस पर भी प्रकाशित: https://medium.com/kuwala-io/using-node-streams-to-transform-the-largest-poi-database-37218f28c996

टैग

हैकर दोपहर में शामिल हों

अपने कस्टम पढ़ने के अनुभव को अनलॉक करने के लिए अपना निःशुल्क खाता बनाएं।

Coinsmart। यूरोपा में बेस्टे बिटकॉइन-बोरसे
स्रोत: https://hackernoon.com/how-to-use-node-streams-to-transform-the-largest-poi-database-km1s37np?source=rss

स्पॉट_आईएमजी

नवीनतम खुफिया

स्पॉट_आईएमजी

हमारे साथ चैट करें

नमस्ते! मैं आपकी कैसे मदद कर सकता हूँ?