Ogr2ogr के साथ पोस्टगिस के लिए एक शेपफाइल आयात करें: डेटा स्रोत खोलने में असमर्थ


13

मैं एक Postgis डेटाबेस में एक आकृति का आयात करने के लिए ogr2ogr का उपयोग करना चाहता हूं। मैंने सफलतापूर्वक ogr2ogr स्थापित किया है और मैं निम्नलिखित कमांड को pgsql से चलाता हूं:

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp

मुझे जो वापस मिलता है वह एक त्रुटि संदेश है:

Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)

मैंने भी आकृति के पूर्ण पथ को परिभाषित करने की कोशिश की है लेकिन मुझे वही संदेश मिला है।

इसके अलावा मैंने इसे चलाने की कोशिश की:

ogrinfo world_boundaries.shp

वही चीज।


फ़ाइल की अनुमतियों के साथ समस्याओं को हल करने के बाद मुझे निम्नलिखित त्रुटि मिलती है:

  ERROR 1: AddGeometryColumn failed for layer world_boundaries, layer creation has failed.
  ERROR 1: Terminating translation prematurely after failed
  translation of layer world_boundaries (use -skipfailures to skip errors)

मैंने GUI shp2pgsql के माध्यम से इसे आयात करने का प्रयास किया और मुझे निम्न त्रुटि मिली:

ALTER TABLE "public".""
Failed in pgui_exec(): ERROR:  permission denied for relation spatial_ref_sys
 CONTEXT:  SQL statement "SELECT SRID         FROM spatial_ref_sys WHERE SRID = new_srid"
PL/pgSQL function addgeometrycolumn(character varying,character   varying,character varying,character varying,integer,character varying,integer,boolean) line 50 at SQL statement
 SQL statement "SELECT AddGeometryColumn('',$1,$2,$3,$4,$5,$6,$7)"
 PL/pgSQL function addgeometrycolumn(character varying,character  varying,character varying,integer,character varying,integer,boolean) line 5 at     SQL statement

Shapefile import failed.

इस बार मुद्दा यह था कि इस डेटाबेस उपयोगकर्ता के पास पर्याप्त अनुमति नहीं थी। यह तय:

GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;

अगला त्रुटि संदेश है:

  Warning 1: Geometry to be inserted is of type 3D Multi Polygon, whereas the layer geometry type is 3D Polygon.
 Insertion is likely to fail
 ERROR 1: INSERT command for new feature failed.
 ERROR:  Geometry type (MultiPolygon) does not match column type (Polygon)

तो ऐसा लगता है कि मुझे पैरामीटर का उपयोग करने की आवश्यकता है: -नहीं MULTIPOLYGON लेकिन जब मैं ऐसा करता हूं तो मुझे एक और त्रुटि मिलती है, जिससे मुझे कोई मतलब नहीं है:

ERROR 1: PostgreSQL driver doesn't currently support database creation.
Please create database with the `createdb' command.
PostgreSQL driver failed to create PG:host=localhost user=my_user_name dbname=my_database password=password -nlt POLYGON

लेकिन यह shp2pgsql GUI के उपयोग से लोड हो जाता है।


@Elrobis की टिप्पणी ने इसे अंततः काम करने में सक्षम बनाया। Db में डेटा सही तरीके से लोड किया गया!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp

ऐसा लगता है कि आपका शेपफाइल वैध नहीं है। क्या यह अन्य सॉफ़्टवेयर में काम करता है?
एविल जीनियस

1
हाँ। QGIS में इसका लोड सही है।
user1919

1
इसके अलावा, यह मानते हुए कि आपका DB पहले से मौजूद है और यह आपके ogr2ogr निर्देश में सही ढंग से लिखा गया है, और कमांड में पोस्टग्रेज उपयोगकर्ता के पास आवश्यक विशेषाधिकारों का पूरा पूरक है (SELECT, INSERT, UPDATE, CREATE .. आदि), -nln layernameतर्क जोड़ने का प्रयास करें । शायद -overwriteयह देखने के लिए कि क्या यह जीवन में आता है। इसके अलावा, अगर मैं तुम थे, मैं ogr2ogr चलाने sudoके साथ-साथ मेरे पोस्ट सुपरसर्स के साथ बस सुपर सुपर कुछ अनुमतियों और विशेषाधिकारों का पालन करने के लिए सुपर होना चाहिए। एक बार जब आप स्क्रिप्ट ठोस हो जाते हैं, तो आप pesky अनुमतियों और विशेषाधिकारों से दूर जा सकते हैं। :)
एलोबिस

3
धन्यवाद। जोड़ने के बजाय ज्वलंत POLYGON के बजाय चाल किया।
user1919

1
खुशी है कि यह काम किया। मैं आगे बढ़ूंगा और एक उत्तर में उचित प्रतिक्रिया दूंगा जो यह भी बताता है कि मुझे क्यों लगता है कि यह काम किया है।
एलब्रोबिस

जवाबों:


17

जैसा कि आपने परीक्षण और त्रुटि के द्वारा खोजा था, कुछ ठीक करने वाले मुद्दे थे जिन्हें आपको ठीक करने की आवश्यकता थी, जिनमें से अंतिम को ogr2ogr के -nlt GEOMETRY* तर्क का उपयोग करके हल किया गया था ।

* @ लीचाचार्य की टिप्पणी में अनुशंसा पर ध्यान दें, -nlt PROMOTE_TO_MULTIजिसका उपयोग डिफ़ॉल्ट समाधान के रूप में किया जाता है, बजाय इसके nlt GEOMETRYकि पूर्व सहायक लाभों के अतिरिक्त सर्वोत्तम अभ्यास को बढ़ावा देता है।

उपयोगकर्ता अनुमतियाँ और त्रुटि संदेश

सबसे पहले, ogr2ogr आपके आकार को नहीं खोल सकता है, और आपको एहसास हुआ कि अनुमतियाँ समस्याएँ वास्तव में OS उपयोगकर्ता को आपके आकार की पहुँच को प्रभावित कर रही हैं। लेकिन दूसरों के लिए यहाँ एक महत्वपूर्ण सबक है, विशेष रूप से, इस बिंदु पर ogr2ogr का त्रुटि संदेश भ्रामक था! वास्तव में, पहले टिप्पणीकारों में से एक ने सोचा था कि आपका शेपफाइल अवैध था, और सच में, मेरा पहला अनुमान यह था कि पथ / फ़ाइलनाम में शायद कोई त्रुटि / टाइपो था, या यह कि फ़ाइल पथ में कोई अपरंपरागत चरित्र रहा हो - जैसे अंतरिक्ष- जो आकृति को इंगित करने के लिए ogr2ogr की क्षमता को तोड़ रहा था। जैसा कि आपने खोजा था, यह वास्तव में उपयोगकर्ता की अनुमति के साथ एक समस्या थी। क्योंकि त्रुटि संदेश एक लाल हेरिंग बनाता है, यह एक संभावना है कि दूसरों को अपने दिमाग के पीछे रखने की आवश्यकता है। :)

SQL उपयोगकर्ता विशेषाधिकार और रहस्य विफलताएँ

मैं थोड़ी देर के लिए आपकी दूसरी त्रुटि से अचंभित हो जाता, लेकिन अपने SQL उपयोगकर्ता को एक अलग आयात उपयोगिता (shp2pgsql) के साथ परीक्षण करके, जो कि स्मार्ट था, आपको एक अधिक सटीक त्रुटि संदेश मिला और आपके SQL उपयोगकर्ता को spatial_ref_sysटेबल पर आवश्यक विशेषाधिकार दिए । तो किसी को अपने ogr2ogr आयात निर्देश को ठीक से काम करने में कठिनाई हो रही है, यह सुनिश्चित करना चाहिए कि उनके SQL उपयोगकर्ता के डेटाबेस और 'spatial_ref_sys' तालिका दोनों पर पर्याप्त विशेषाधिकार हैं ।

मिश्रित ज्यामिति प्रकार और सर्वोत्तम अभ्यास

आपके द्वारा लगाई गई अंतिम बाधा इस तथ्य से संबंधित है कि आकृतिफाइल्स एकल और मल्टीपार्ट जियोमेट्री के लिए समान डेटासेट / फाइल में सह-अस्तित्व के लिए अनुमति देते हैं। ज्यामिति प्रकारों को एक ही तालिका में मिलाना बुरा व्यवहार माना जाता है, यहाँ तक कि एक ही प्रकार के एकल / बहुकार्य के लिए, और डिफ़ॉल्ट रूप से, आपके टूलकिन में खुले स्रोत के खिलाड़ी आपको ज्यामिति के प्रकारों को मिलाने से बचाने की कोशिश करेंगे। सौभाग्य से, हालांकि, वे आपको कुछ विकल्प देते हैं। प्रारंभ में मैंने आपके ogr2ogr निर्देश पर -nlt GEOMETRY* तर्क को स्थापित करने की सिफारिश की , जिसने आपको ESRI के शिथिल सम्मेलन के बावजूद अपने बहुभुज डेटासेट को आयात करने की अनुमति दी। हालांकि सलाह दी जाती है, इसका मतलब है कि आपके टेबल में शायद एकल भाग और बहु-भाग दोनों हैं, और यह आपके बाद के अन्य सिरदर्द पैदा कर सकता है!

यह ध्यान देने योग्य है कि ogr2ogr का एक और -nltविकल्प है जिसे आपको विचार करना चाहिए, अर्थात् PROMOTE_TO_MULTIप्रलेखन उद्धृत करने के लिए ।।

GDAL 1.10 से शुरू होकर, PROMOTE_TO_MULTI का उपयोग बहुभुज के लिए बहुभुज या मल्टीलिग्लोन को मिलाने वाली परतों को स्वचालित रूप से बढ़ावा देने के लिए किया जा सकता है, और परतें जो मल्टीलाइनस्ट्रेस में लाइनस्टर या मल्टीलिनस्ट्रेस को मिलाती हैं। PostGIS और अन्य लक्षित ड्राइवरों के लिए शेपफाइल्स को परिवर्तित करते समय उपयोगी हो सकता है जो ज्यामिति प्रकारों के लिए सख्त जांच को लागू करते हैं।

दूसरे शब्दों में, यदि आप PROMOTE_TO_MULTIध्वज का उपयोग करते हैं , तो आपकी सभी सुविधाएँ बहुकारण सुविधाओं में परिवर्तित हो जाएंगी, तब भी जब वे एकल भाग से युक्त हों। जैसा कि टिप्पणियों में @LeeHachadoorian ने उल्लेख किया है- और मुझे यकीन है कि सबसे सहमत होंगे- आपको सलाह दी जाती है कि आप PROMOTE_TO_MULTIहारने वाले GEOMETRYझंडे को प्राथमिकता दें , क्योंकि यह आपकी तालिका में फीचर ज्यामिति को एकीकृत करते हुए सर्वश्रेष्ठ अभ्यास के अनुरूप है। मूल रूप से, आपके द्वारा लिखा गया कोई भी कोड बस मल्टीपार्ट जियोमेट्रीज़ की अपेक्षा करना चाहिए। जाहिर है, यह क्लीनर हो सकता है और विकास के कुछ सरल कर सकता है।

किसी व्यक्ति को किसी SHP से POST आयात में परेशानी होने की सामान्य सलाह

  1. सुनिश्चित करें कि आपके रास्तों में कोई फंकी कैरेक्टर नहीं हैं और यह कि पथ या फ़ाइल नाम में कोई टाइपोस या मिस्पेलिंग नहीं हैं
  2. जैसा कि @ user1919 ने खोजा है, सुनिश्चित करें कि आपके OS उपयोगकर्ता के पास आकार-प्रकार तक पहुँचने के लिए पर्याप्त विशेषाधिकार हैं! जैसा कि उन्होंने प्रदर्शन किया, यह QGIS जैसे किसी अन्य सॉफ़्टवेयर में शेपफाइल को खोलने का प्रयास करने में मदद कर सकता है - यदि यह एक सॉफ़्टवेयर में काम करता है, तो यह भ्रष्ट नहीं है, और इसे अन्य सॉफ़्टवेयर में काम करना चाहिए।

सबसे पहले, अपने ogr2ogr कमांड को निष्पादित करने पर विचार करें क्योंकि sudoजब तक आप अपनी स्क्रिप्ट के अनुसार काम कर रहे होते हैं, तब तक आपको अनुमतियों के नियम से बाहर निकलने की अनुमति नहीं होती है।

  1. जैसा कि @ user1919 ने महसूस किया है, सुनिश्चित करें कि आपके एसक्यूएल उपयोगकर्ता के पास आपकी स्क्रिप्ट द्वारा लक्षित दोनों डेटाबेस पर पर्याप्त विशेषाधिकार हैं, साथ ही spatial_ref_sysतालिका भी।

फिर, पहले, जब आपकी स्क्रिप्ट काम कर रही हो, तो SQL विशेषाधिकार के मुद्दों को नियमबद्ध करने के लिए यहाँ पोस्टग्रैसक्ल सुपर यूजर का उपयोग करने पर विचार करें। यदि आपकी स्क्रिप्ट सुपरयुजर के साथ काम करती है, तो एक पसंदीदा ऑटोमेशन उपयोगकर्ता के साथ विफल हो जाती है, तो आप जानते हैं कि समस्या SQL उपयोगकर्ता से संबंधित है और आपके डेटा या आपके वातावरण (gdal / ogr स्थापना, आदि) से नहीं

  1. सेट करने का प्रयास -nltकरने के लिए या तो झंडा PROMOTE_TO_MULTIया GEOMETRY। चूंकि शेपफाइल्स एक ढीले फ़ीचर प्रकार के सम्मेलन के लिए अनुमति देते हैं, कभी-कभी आपको अपने ओपन सोर्स उपयोगिताओं को अधिक समायोजित करने का निर्देश देना पड़ता है :)

  2. यदि आप PostGRESql या MySQL में आयात कर रहे हैं, तो सेटिंग की कोशिश करें -lco PRECISION=no.. यदि चेतावनी दी जाए, तो मुझे ठीक से समझ में नहीं आता कि यह तर्क क्या करता है, लेकिन यहां मैंने जो अनुभव किया है .. जैसा कि आप जानते हैं, आकार-प्रकार में अक्सर फ़ील्ड SHAPE_LENGTHऔर SHAPE_AREAफ़ील्ड शामिल होते हैं , और मैं जब मुझे रहस्य विफलताओं का सामना करना पड़ रहा है, तो कभी-कभी ध्यान दिया जाता है, अगर मैं उन क्षेत्रों को हटा देता हूं तो मुझे सही तरीके से आयात करने के लिए डेटा मिल सकता है। हालाँकि, यदि मैं उपयोग करता हूं, तो मैं -lco PRECISION=noउन फ़ील्ड को हटाने के लिए बिना आयात किए डेटा प्राप्त कर सकता हूं। मेरी अनुशंसा है कि इस पैरामीटर का उपयोग समस्या निवारण चरण के रूप में किया जाए, लेकिन यह समझने के लिए कि उत्पादन समाधान में आयात स्वीकार करने से पहले यह वास्तव में क्या समस्या है।

  3. अंत में, यदि आप MySQL का उपयोग कर रहे हैं, तो ध्यान रखें कि कुछ बहुत बड़ी सुविधा वाले ज्यामिति MySQL के max_allowed_packetपैरामीटर को रोक सकते हैं । आप इसके बारे में MySQL ड्राइवर के लिए प्रलेखन में अधिक पढ़ सकते हैं .. लेकिन इसका समाधान डिफ़ॉल्ट मूल्य से अधिक के लिए अनुमति देने के लिए अपने MySQL कॉन्फ़िगरेशन को बदलना है।

उदाहरण के लिए SHP को PostGIS आयात कमांड के लिए ogr2ogr

किसी भी नए शौक की खातिर, जो यहां से भटक सकते हैं, यह वही है जो मेरे SHP से पोस्ट आयातों में से अधिकांश का उपयोग ogr2ogr की तरह दिखता है। ध्यान दें कि मैं उद्धरणों में फ़ाइल पथ / नामों को लपेटता हूं, यह रिक्त स्थान, अजीब वर्णों और टर्मिनल के पार की रेखा को बचाता है .. साथ ही मैंने ऊपर चर्चा की अधिकांश दलीलें शामिल की हैं, जिसमें ज्यामिति नाम क्षेत्र के लिए ओवरराइड के अलावा, FID फ़ील्ड, और परत नाम:

ogr2ogr -f "PostgreSQL" "PG:host=127.0.0.1 user=myuser dbname=mydb password=mypassw0rd" "C:/path/to/some_shapefile.shp" -lco GEOMETRY_NAME=the_geom -lco FID=gid -lco PRECISION=no -nlt PROMOTE_TO_MULTI -nln new_layername -overwrite


3
के बारे में -nlt PROMOTE_TO_MULTI, यह वास्तव में बहुभुज ज्यामितीयों के लिए एक सर्वोत्तम अभ्यास है। मैं आपको एक मजबूत डिफ़ॉल्ट विकल्प के रूप में सलाह देने के लिए आपके उत्तर को बदलने का सुझाव दूंगा, केवल सावधानीपूर्वक विचार के बाद उल्लंघन किया जा सकता है। मैं भी geometryमिश्रित बहुभुज / बहुभुज को संभालने के लिए सामान्य प्रकार का उपयोग करने के खिलाफ दृढ़ता से सलाह दूंगा, जब तक कि उपयोगकर्ता / डेवलपर वास्तव में नहीं जानते कि वे क्या कर रहे हैं और बहुभुज, रेखा और बिंदु प्रकार को मिलाने की आवश्यकता है।
ली हैचेरियन

1
@ लीहाचोरियन, सहमत। मैंने सुझाए अनुसार उत्तर संपादित किया। मेरे बचाव में, PROMOTE_TO_MULTIनया-पर्याप्त (GDAL 1.10) है कि मैं अभी भी मूल समाधान के लिए डिफ़ॉल्ट हूं जो मुझे इस सब में शुरू होने पर उपलब्ध था। :) .. सभी निष्पक्षता में, हालांकि, एक आकृति केवल एकल और बहुकारण प्रकारों को जोड़ती है, इसलिए ऐसा कोई परिदृश्य कभी नहीं होगा जहां ogr2ogr एक शाप के माध्यम से धक्का देगा -nlt GEOMETRYऔर अंक, रेखाओं और ध्रुवों के साथ एक तालिका बनाएगा :)))) हालाँकि मैं मामले पर आपकी स्थिति से पूरी तरह सहमत हूँ।
एलोबिस

1
शेपफाइल्स अपने बहुभुज प्रकार में कई बहुभुजों की अनुमति देते हैं। उनके पास मल्टीपॉलिगॉन टाइप भी नहीं है। तो जब भी इस तरह की आकार फ़ाइल का सामना करना पड़ता है, -nlt PROMOTE_TO_MULTIतो इस काम को करने के लिए किसी को उपयोग करने की आवश्यकता होती है ।
CMCDragonkai 7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.