আমি জিওটুলস সহ একটি মানচিত্র তৈরি করতে এবং এটি একটি চিত্রে সংরক্ষণ করতে চাই (যেমন জেপিইজি)। আমার প্রয়োজনীয়তা সহজ:
- 2 স্তর সহ বিশ্বের মানচিত্র তৈরি করুন: রাজনৈতিক সীমানা এবং একটি গ্র্যাচিকুল। স্তরগুলি বিভিন্ন উত্স এবং বিভিন্ন অনুমান থেকে।
- মানচিত্রকে বিভিন্ন অনুমানগুলিতে আউটপুট করুন (উদাঃ "EPSG: 5070", "EPSG: 4326", "EPSG: 54012", "EPSG: 54009" ইত্যাদি)
- আউটপুটটি বিভিন্ন এওআইতে ক্লিপ করুন (যেমন -124.79 থেকে -66.9 লম্বা, 24.4 থেকে 49.4 ল্যাট)।
আমি এপিআইয়ের মাধ্যমে এই প্রোগ্রামটিমেটিকভাবে করতে চাই। এখনও অবধি আমার সীমাবদ্ধ সাফল্য ছিল। আমি এই পদ্ধতির ব্যবহার করে বিভিন্ন অনুমানে একটি মানচিত্র এবং আউটপুট তৈরি করতে শিখেছি:
//Step 1: Create map
MapContent map = new MapContent();
map.setTitle("World");
//Step 2: Set projection
CoordinateReferenceSystem crs = CRS.decode("EPSG:5070"); //Conic projection over US
MapViewport vp = map.getViewport();
vp.setCoordinateReferenceSystem(crs);
//Step 3: Add layers to map
CoordinateReferenceSystem mapCRS = map.getCoordinateReferenceSystem();
map.addLayer(reproject(getPoliticalBoundaries(), mapCRS));
map.addLayer(reproject(getGraticules(), mapCRS));
//Step 4: Save image
saveImage(map, "/temp/graticules.jpg", 800);
সংরক্ষণ পদ্ধতিটি জিওটুলস ওয়েবসাইট থেকে সরাসরি :
public void saveImage(final MapContent map, final String file, final int imageWidth) {
GTRenderer renderer = new StreamingRenderer();
renderer.setMapContent(map);
Rectangle imageBounds = null;
ReferencedEnvelope mapBounds = null;
try {
mapBounds = map.getMaxBounds();
double heightToWidth = mapBounds.getSpan(1) / mapBounds.getSpan(0);
imageBounds = new Rectangle(
0, 0, imageWidth, (int) Math.round(imageWidth * heightToWidth));
} catch (Exception e) {
// failed to access map layers
throw new RuntimeException(e);
}
BufferedImage image = new BufferedImage(imageBounds.width, imageBounds.height, BufferedImage.TYPE_INT_RGB);
Graphics2D gr = image.createGraphics();
gr.setPaint(Color.WHITE);
gr.fill(imageBounds);
try {
renderer.paint(gr, imageBounds, mapBounds);
File fileToSave = new File(file);
ImageIO.write(image, "jpeg", fileToSave);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
পুনঃপ্রকাশের পদ্ধতিটি আমার আবিষ্কার। এটি কিছুটা হ্যাক তবে এর একমাত্র উপায় আমি কোনও নির্দিষ্ট অভিক্ষেপে কোনও চিত্র আউটপুট খুঁজে পেতে পারি।
private static Layer reproject(Layer layer, CoordinateReferenceSystem mapCRS) throws Exception {
SimpleFeatureSource featureSource = (SimpleFeatureSource) layer.getFeatureSource();
//Define coordinate transformation
CoordinateReferenceSystem dataCRS = featureSource.getSchema().getCoordinateReferenceSystem();
boolean lenient = true; // allow for some error due to different datums
MathTransform transform = CRS.findMathTransform(dataCRS, mapCRS, lenient);
//Create new feature collection
SimpleFeatureCollection copy = FeatureCollections.newCollection("internal");
SimpleFeatureType featureType = SimpleFeatureTypeBuilder.retype(featureSource.getSchema(), mapCRS);
SimpleFeatureIterator iterator = featureSource.getFeatures().features();
try {
while (iterator.hasNext()) {
SimpleFeature feature = iterator.next();
Geometry geometry = (Geometry) feature.getDefaultGeometry();
Geometry geometry2 = JTS.transform(geometry, transform);
copy.add( SimpleFeatureBuilder.build( featureType, new Object[]{ geometry2 }, null) );
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
iterator.close();
}
//Return new layer
Style style = SLD.createLineStyle(Color.BLACK, 1);
layer = new FeatureLayer(copy, style);
layer.setTitle("Graticules");
return layer;
}
আউটপুটটি সত্যই খারাপ:
সুতরাং, আমি অনুমান করি আমার কয়েকটি পৃথক প্রশ্ন রয়েছে:
- এটা কি সঠিক পন্থা? আমার কি সত্যিই স্তরে স্তরে পুনরায় প্রজেক্ট করা দরকার বা ম্যাপভিউপোর্টটি আমার জন্য এটি করার কথা?
- আমি কীভাবে একটি নির্দিষ্ট এওআইতে আউটপুট ক্লিপ করব? আমি ম্যাপভিউপোর্টপোর্ট.সেটবাউন্ডস (খাম) পদ্ধতিটি ব্যবহার করে সীমানা নির্ধারণ করার চেষ্টা করেছি তবে সেভ-ইমেজ পদ্ধতিটি সীমানাকে উপেক্ষা করে বলে মনে হচ্ছে।
- আর্কস হিসাবে রেন্ডার করতে আমি কীভাবে আমার অক্ষাংশ রেখা পেতে পারি? আমি কি অনুপস্থিত একটি রূপান্তর সেটিংস আছে?
আমি জিওটুলগুলি 8.7 ব্যবহার করছি।