أكثر

Geotools shapefile و geotiff عرض المشكلة في JMapPane

Geotools shapefile و geotiff عرض المشكلة في JMapPane


أحاول الحصول على JMapPane للظهور في JPanel ، ولكن دون نجاح. يوجد أدناه مثيل JPanel الذي يحتوي على الخريطة. أقوم باستيراد ملف جغرافي وملف أشكال بطبقات بهذا الترتيب. لا تظهر طبقة البيانات النقطية الجغرافية فحسب ، بل يتم عرض ملف الشكل بشكل عكسي. ما الخطأ الذي افعله؟

استيراد java.awt.BorderLayout ؛ استيراد java.awt.Color ؛ استيراد java.awt.Dimension ؛ استيراد ملف java.io. استيراد java.io.IOException ؛ استيراد java.net.URISyntaxException ؛ استيراد javax.swing.JPanel ؛ استيراد org.geotools.coverage.GridSampleDimension ؛ استيراد org.geotools.coverage.grid.GridCoverage2D ؛ استيراد org.geotools.coverage.grid.io.AbstractGridFormat ؛ استيراد org.geotools.coverage.grid.io.GridCoverage2DReader ؛ استيراد org.geotools.coverage.grid.io.GridFormatFinder ؛ استيراد org.geotools.data.FileDataStore ؛ استيراد org.geotools.data.FileDataStoreFinder ؛ استيراد org.geotools.data.simple.SimpleFeatureSource ؛ استيراد org.geotools.factory.CommonFactoryFinder ؛ استيراد org.geotools.map.FeatureLayer ؛ استيراد org.geotools.map.GridReaderLayer ؛ استيراد org.geotools.map.Layer ؛ استيراد org.geotools.map.MapContent ؛ استيراد org.geotools.styling.ChannelSelection ؛ استيراد org.geotools.styling.ContrastEnhancement ؛ استيراد org.geotools.styling.RasterSymbolizer ؛ استيراد org.geotools.styling.SLD ؛ استيراد org.geotools.styling.SelectedChannelType ؛ استيراد org.geotools.styling.Style ؛ استيراد org.geotools.styling.StyleFactory ؛ استيراد org.geotools.swing.JMapPane ؛ استيراد org.opengis.filter.FilterFactory2 ؛ استيراد org.opengis.style.ContrastMethod ؛ تقوم فئة MapImagePanel العامة بتوسيع لوحة JPanel {التسلسلي الطويل النهائي الخاص الثابت = -7924289582676785758L ؛ ملف خاص blueMarble = null؛ ملف خاص borderShape = null؛ GridCoverage2DReader الخاص GridCoverage2DReader ؛ styleFactory styleFactory الخاص = CommonFactoryFinder.getStyleFactory () ، public StyleFactory getStyleFactory () {return styleFactory؛ } private FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2 () ، Public MapImagePanel () {this.setLayout (new BorderLayout (0، 0))؛ this.setBackground (Color.BLUE) ، this.setPreferredSize (أبعاد جديدة (720 ، 360)) ؛ جرب {this.setBlueMarble (new File (this.getClass (). getResource ("/ gis / BlueMarbleNG_2004-12-01_rgb_720x360.tiff"). toURI ()))؛ } catch (URISyntaxException e1) {e1.printStackTrace () ؛ } جرب {this.setBorderShape (new File (this.getClass (). getResource ("/ gis / world_borders / TM_WORLD_BORDERS-0.3.shp"). toURI ())) ؛ } catch (URISyntaxException e1) {e1.printStackTrace () ؛ } جرب {this.displayLayers ()؛ } catch (استثناء هـ) {e.printStackTrace ()؛ }} يطرح displayLayers () الفراغ الخاص استثناء {AbstractGridFormat format = GridFormatFinder.findFormat (this.getBlueMarble ())؛ this.setGridCoverageReader (format.getReader (this.getBlueMarble ())) ؛ أسلوب rgbStyle = this.createRGBStyle () ، // الاتصال بملف الشكل FileDataStore dataStore = FileDataStoreFinder.getDataStore (this.getBorderShape ()) ؛ SimpleFeatureSource shapefileSource = dataStore.getFeatureSource () ؛ نمط shpStyle = SLD.createPolygonStyle (لون أزرق ، فارغ ، 0.0f) ؛ خريطة MapContent النهائية = MapContent الجديدة () ؛ map.setTitle ("LogMap") ؛ Layer rasterLayer = جديد GridReaderLayer (this.getGridCoverageReader ()، rgbStyle) ؛ map.addLayer (طبقة نقطية) ؛ Layer shpLayer = جديد FeatureLayer (shapefileSource ، shpStyle) ؛ map.addLayer (shpLayer) ؛ JMapPane mapPane = جديد JMapPane () ؛ mapPane.setMapContent (خريطة) ؛ //mapPane.setDisplayArea (shapefileSource.getBounds ()) ؛ mapPane.setDisplayArea (this.getGridCoverageReader (). getOriginalEnvelope ()) ؛ this.add (mapPane، BorderLayout.CENTER) ؛ } // docs start create rgb style / ** * تفحص هذه الطريقة أسماء أبعاد العينة في التغطية * المقدمة بحثًا عن "أحمر ..." و "أخضر ..." و "أزرق ..." (تطابق * غير حساس لحالة الأحرف). إذا لم يتم العثور على هذه الأسماء ، فإنه يستخدم النطاقات 1 و 2 و 3 للقنوات * الأحمر والأخضر والأزرق. يقوم بعد ذلك بإعداد رمز نقطي وإرجاع هذا ملفوفًا في نمط. * *return كائن نمط جديد يحتوي على رمز نقطي تم إعداده لـ RGB * image * / private Style createRGBStyle () {GridCoverage2DReader reader = this.getGridCoverageReader ()؛ StyleFactory sf = this.getStyleFactory () ، GridCoverage2D cov = خالية ؛ جرب {cov = reader.read (null) ؛ } catch (IOException giveUp) {throw new RuntimeException (giveUp)؛ } // نحتاج إلى ثلاثة نطاقات على الأقل لإنشاء عدد int numBands بنمط RGB = cov.getNumSampleDimensions () ؛ if (numBands <3) {return null؛ } // احصل على أسماء النطاقات String [] sampleDimensionNames = new String [numBands]؛ لـ (int i = 0 ؛ i 

تحديث

تمت إضافة بضعة أسطر ولديها الآن حدود ملف الشكل تظهر بشكل صحيح ، لكن Geotiff لا يزال مفقودًا.

تحت طريقة displayLayers () أضفت:

... mapPane.setMapContent (خريطة) ؛ mapPane.setDisplayArea (shapefileSource.getBounds ()) ؛ ...

هذه هي النتيجة:


يبدو أن هذا يعمل بالنسبة لي - أنا أستخدم حدود الإدارة من Natural Earth و Blue Marble jpeg (مع ملف عالمي يدوي) وهذا الكود الذي يعطيني هذه الصورة.

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


شاهد الفيديو: Tutorial 10 - Geoserver - Publishing a shapefile and GeoTIFF