أكثر

عد مميز بعبارة "أين" في OGR

عد مميز بعبارة


إنني أتطلع إلى تشغيل استعلام في OGR لإعادة كتابة جميع الحالات التي لا يوجد فيها سوى سجل واحد للسمة. كنت أفكر في استخدام ما يلي:

ogrinfo -dialect sqlite -sql "حدد العدد (*) من الطرق مثل roadcnt حيث roadcnt = 1 GROUP BY road_name" roads.shp> report.txt

يعرض هذا الاستعلام خطأً: بالقرب من "road_name": خطأ في بناء الجملة


هذا هو في الغالب سؤال SQL يناسب بشكل أفضل أمر stackoverfow.

الخطأ الأول في SQL هو أنك تستخدم "GROUP BY road_name" لكنك لم تحدد "road_name".

خطأ آخر هو أن الدالات التجميعية مثل count () لا يمكن استخدامها بشكل عام في WHERE ولكن يجب وضعها في HAVING أو في استعلام فرعي. راجع https://stackoverflow.com/questions/6319183/aggregate-function-in-sql-where-clause و http://www.sqlite.org/lang_select.html

هدفك هو في الواقع استعلام "العثور على التكرارات" ولكن معكوس. لذلك فإن الإجابات في https://stackoverflow.com/questions/6779607/sql-query-to-find-the-duplicate-records تناسبك أيضًا. لقد أجريت اختبارًا باستخدام نسخة معدلة من الإجابة الثالثة. لا تولي اهتماما للعد (*) = 4 ، هذا فقط لأنه من بياناتي باستخدام العد = 1 لا يعثر على أي شيء.

ogrinfo -dialect sqlite -sql "حدد sub_region ، count (*) كعد من مجموعة الدول حسب المنطقة الفرعية التي تحتوي على عدد (*) = 4" state.shp INFO: فتح "state.shp" باستخدام برنامج التشغيل "ESRI Shapefile" ناجح. اسم الطبقة: SELECT Geometry: بلا عدد الميزات: 2 Layer SRS WKT: (غير معروف) SUB_REGION: String (0.0) count: Integer (0.0) OGRFeature (SELECT): 0 SUB_REGION (String) = ES Cen count (Integer) = 4 OGRFeature (تحديد): 1 SUB_REGION (سلسلة) = عدد WS Cen (عدد صحيح) = 4

يجب أن يعمل أمر ogrinfo هذا من أجلك:

ogrinfo -dialect sqlite -sql "SELECT road_name ، COUNT (*) من الطرق AS roadcnt المجموعة حسب road_name HAVING roadcnt = 1" roads.shp> report.txt

بنغو. لقد اشتمل على القليل من السحر الذي يقوم بتوجيه تعليمات ogr2ogr معًا عبر STDIN / OUT ، وستحتاج إلى تكييفها مع أغراضك ، ولكن شيئًا كهذا يجب أن يعمل:

ogr2ogr -f "GeoJSON" / vsistdout / -dialect sqlite -sql "حدد الاسم الكامل ، COUNT (*) كـ ct FROM ROADS_3857 GROUP حسب الاسم الكامل" "C: xGIS Vector ROADS_3857.shp" | ogr2ogr -f "CSV" - حيث "ct = 1" / vsistdout / / vsistdin /> "C: xGIS Vector ROADS_3857_shpreport.txt"

يؤدي هذا إلى إخراج ملف يسمى "ROADS_3857_shpreport.txt" في نفس الدليل مثل الملف الأولي.shpمصدر. تبدو البيانات الموجودة في الملف كما يلي:

FULLNAME، ct… truncated… Casterton Dr E، 1 Casterton Dr W، 1 Castine Dr، 1 Castle Hall Ln، 1 Castleburg Ln، 1 Castledale Rd، 1 ... truncated…

إليك التفكير الأساسي ... تقوم مكالمة ogr2ogr الأولى بعمل التحديد الداخلي ، باستخدام OGR SQL لإنشاء قيمة العد التي تحتاجها (المسماةط مفي المثال الخاص بي) وفرض GROUP BY ، والتي تدفعها إلى STDOUT (مثل GeoJSON ، المزيد عن ذلك بعد قليل) لكل/ vsistdout /ضع علامة على المكان الذي سيذهب إليه مسار إخراج البيانات بشكل طبيعي. بعد ذلك ، الأنبوب|يشير إلى مكالمة ogr2ogr ثانية ، والتي تتلقى النتيجة الأولية المحددة عبر STDIN (ملاحظة/ vsistdin /علامة في مسار إدخال البيانات) ويطبق ملف-أينالحجة لإرجاع السجلات ذات قيمة العد "1" ، مرة أخرى دفع النتيجة النهائية إلى STDOUT عن طريق تعيين مسار الإخراج إلى/ vsistdout /من أجل كتابتها في ملف .txt كما أوضحت في سؤالك.

ربما يجب أن أشرح سبب استخدامي-f "GeoJSON"و-f "CSV"كصيغتي الإخراج. أولاً ، على ما يبدو استعداد ogr2ogr لدفع تنسيقات البيانات المختلفة/ vsistdout /"يصعب معرفة ذلك" ، ولم أجد أي شيء قوي من خلال البحث في Google عن السؤال. بالإضافة إلى ذلك ، فإن استعداد ogr2ogr ل تلقي تنسيقات مختلفة/ vsistdin /بنفس القدر من الغموض. لذلك رفضت تصديق أن هذا مستحيل ، لقد جربت فقط دفع تنسيق واحد من خلاله/ vsistdout /واستلامها/ vsistin /حتى وجدت مجموعة ناجحة - هكذا وصلت إلى GeoJSON و CSV ، على التوالي. لم يكن هناك أي منطق مقنع هناك. :) نموذج بيانات ogr في أعماق كل هذا يحافظ على الأشياء سليمة ، لذلك لا يهم حقًا تنسيقات برامج التشغيل التي نستخدمها لنقل البيانات في المنتصف ، طالما أنها تعمل بشكل جيد معًا عبر SDTIN / STDOUT.

من المهم أيضًا أن تذكر أنه إذا أردت ، يمكنك استبدال ملف/ vsistout /في ال ثانيا تعليمات ogr2ogr مع أي تنسيق إخراج يدعم ogr2ogr ، مثل ملف الأشكال و MySQL و PostGRESql وما إلى ذلك./ vsistdout /مرة أخرى لدفعه إلى ملف السجل.

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