أكثر

ملف الشكل لتحويل GeoJson باستخدام C #

ملف الشكل لتحويل GeoJson باستخدام C #


لدي بعض ملفات الأشكال التي أريد تحويلها إلى GeoJSON وتخزينها في MongoDB للاستعلام.

هل من الممكن أخذ ملف شكل وتحويله إلى تنسيق GeoJSON في C #؟ لقد تمكنت من تحويل ملفات الأشكال إلى GeoJSON من برامج التشغيل المتاحة عبر الإنترنت ثم استيراد المستندات في MongoDB ، لكنني أرغب في إنجاز كل ذلك في C # فقط. السبب هو القدرة على السماح لي بإجراء بعض التغييرات على المستند أثناء التنقل.

إذا لم يكن هناك حل متاح على هذا النحو ، فإن توجيهي في الاتجاه الصحيح سيكون مفيدًا.


كنت أعمل على شيء قريب من هذا الصباح (باستثناء مصدري هو PostgreSQL) وأنا قادم إليه من روابط GDAL C #. لكني لم أحلها بعد. تذكر معظم المنشورات (ليست حديثة) تنفيذ ogr2ogr.cpp في .NET. لكنني آمل أن ينشر شخص ما شيئًا أحدث.

للاختبار ، سيكون هذا هو ما ستسميه من سطر الأوامر (وهذا ما نريده كلانا من c #):
ogr2ogr -f GeoJSON outshp.json c: temp us_counties_.shp

هذا يحصل على Geometry JSON ، وربما يمكنك بناء الباقي والحصول على ميزة GeoJSON الكاملة. لكني لا أعرف ما إذا كان هناك شيء موجود بالفعل في روابط c #.

[TestMethod ()] الفراغ العام WriteGeoJSONTest3 () {string shapeFilePath = @ "c:  temp  us_counties_.shp"؛ OSGeo.OGR.Ogr.RegisterAll () ، سائق drv = Ogr.GetDriverByName ("ESRI Shapefile") ؛ var ds = drv.Open (شكل FilePath ، 0) ؛ / * برنامج التشغيل geoJSONDriver = Ogr.GetDriverByName ("GeoJSON") ؛ سلسلة geojsonfilepath = @ "c:  temp  us_counties_test.json"؛ if (System.IO.File.Exists (geojsonfilepath)) System.IO.File.Delete (geojsonfilepath) ؛ geoJSONDriver.CreateDataSource (@ "c:  temp  us_counties_test.json" ، فارغ) ؛ * / OSGeo.OGR.Layer layer = ds.GetLayerByIndex (0) ؛ OSGeo.OGR.F Feature f ؛ layer.ResetReading () ، System.Text.StringBuilder sb = new System.Text.StringBuilder ()؛ while ((f = layer.GetNextFeature ())! = فارغة) {var geom = f.GetGeometryRef () ؛ إذا (geom! = null) {var geometryJson = geom.ExportToJson () ؛ sb.AppendLine (هندسة Json) ؛ }} Trace.WriteLine (sb.ToString ()) ، Assert.IsNotNull (sb.Length> 0) ؛ }

أعتقد أنك تعتني بمكتبة GDAL / OGR. قم بإلقاء نظرة على http://www.gdal.org/ogr_apitut.html البرنامج التعليمي المتجه و http://trac.osgeo.org/gdal/wiki/GdalOgrInCsharp


قبل أن تبدأ ، اتبع الخطوات:

  • في إدارة حزم NuGet ، قم بتثبيت GDAL و GDAL
  • انقل GdalConfiguration.cs إلى مجلد App_Start في مشروعك
  • في Global.asax.cs أضف هذا

    Application_Start () باطل محمي {… GdalConfiguration.ConfigureGdal () ؛…}

أنت بخير للمتابعة الآن ...


إذا كنت تريد ميزات بخصائص مثل ملفميزةجمعيمكنك استخدام هذا.

السلسلة العامة ShpToGeoJSON (سلسلة Inputpath) {GdalConfiguration.ConfigureGdal () ، GdalConfiguration.ConfigureOgr () ، OSGeo.OGR.Ogr.RegisterAll () ، OSGeo.OGR.Driver drv = Ogr.GetDriverByName ("ESRI Shapefile") ؛ DataSource ds = drv.Open (Inputpath، 0) ؛ طبقة طبقة OSGeo.OGR.Layer = ds.GetLayerByIndex (0) ؛ OSGeo.OGR.F Feature f ؛ layer.ResetReading () ، System.Text.StringBuilder sb = new System.Text.StringBuilder ()؛ sb.AppendLine ("{" type  ": " FeatureCollection  "، " features  ": [")؛ while ((f = layer.GetNextFeature ())! = فارغة) {// Geometry var geom = f.GetGeometryRef () ؛ إذا (geom! = null) {var geometryJson = geom.ExportToJson (سلسلة جديدة [] {}) ؛ sb.Append ("{" type  ": " Feature  "، " geometry  ":" + geometryJson + "،")؛ } // عدد الخصائص int = f.GetFieldCount () ؛ إذا (عدد! = 0) {sb.Append ("" خصائص  ": {") ؛ لـ (int i = 0؛ i 

مجموعة عرض MVC: InvalidCastException: غير قادر على تحويل كائن من النوع & # 39Models.ConversionRate & # 39 لكتابة & # 39System.Collections.IEnumerable & # 39

لدي كائن أقوم بتمريره بنجاح إلى وجهة نظري مع مجموعة بداخله مأهولة بشكل صحيح.

مثالي. هي عبارة عن مجموعة من المضاعفات:

وحدة التحكم الخاصة بي. تم تمرير CurrencyConverter بشكل صحيح من خلال وجهة نظري:

في مصحح الأخطاء ، يمكنني رؤية أن Model.conversion_rates يتم ملؤها بشكل صحيح ، لكن لا يمكنني تخزين كل عنصر فردي بعملة var الخاصة بي لعرضها في الجدول الخاص بي.

يمكنني الوصول إلى كل عنصر فردي وعرضه بشكل جيد بمجرد القيام بما يلي:

لكن لأسباب عديدة ، هذا ليس عمليًا. يمكن إضافة قيم جديدة ديناميكيًا وما إلى ذلك ، لذا فأنا بحاجة للوصول إلى البيانات الموجودة في Converter.conversion_rates ، وهي المجموعة التي أحتاج إلى الوصول إليها.

هذه إجابة صادفتها ، لكنها تعطيني الخطأ التالي:

InvalidCastException: غير قادر على تحويل كائن من النوع "Models.ConversionRate" لكتابة "System.Collections.IEnumerable".

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

نقدر أي اقتراحات.

تحرير: لذا يبدو أن الإصلاح السابق الذي جربته هو الإصلاح الصحيح ، فإن نموذجي أفضل حالًا باستخدام:

لكن هذا يفسد إلغاء التسلسل الخاص بي. سيتم التحديث إذا وجدت الإصلاح.


شاهد الفيديو: Converting a Shapefile to GeoJSON with QGIS