Hi Dennis, I'm not sure about the version of geotools you are talking about, but in the past I used to apply crs by passing it to the mapcontext:
mapContext = new DefaultMapContext(crs); Also, I notice that your area of interest is in degree. I assume that will not work as soon as the crs is really applied. Ciao, Andrea On Wed, Apr 2, 2008 at 10:20 AM, Dennis Yavorsky <[EMAIL PROTECTED]> wrote: > Hello! > > I'am stuck trying to render map in mercator projection. > Whatever i try geotools is not rendering in any other projection than > which you can see on image > http://ds.azcltd.com/quickStart/geotools_QuickStart.jpg (I don't know what > projection it is). As you can see this image does'not > look even a bit like mercator. (For demonstration another image > http://ds.azcltd.com/quickStart/google_mercator.jpg - google maps > screenshot - that is example of projection I want to have) > > I spent really lots of time! I read lots of documentations, mailing > lists... I do not know what I am doing wrong! StreamingRenderer alwayl > produce same result! I tryed many variants of WKT - result is the same. > Please, help me to solve this problem > > I use geotools 2.4.1. > I have attached my source's main file QuickStart.java. > whole test project is available at > http://ds.azcltd.com/quickStart/QuickStart.zip - approximately 36 kbytes (it > consists of 5 java files and 3 resource files. ) > > Please, help me! > > ps: I know that my english is not so good... So, excuse me for that. > > > > > > > > > package com.azoft; > > import com.vividsolutions.jts.geom.Envelope; > import org.geotools.filter.IllegalFilterException; > import org.geotools.gui.swing.*; > import org.geotools.map.DefaultMapContext; > import org.geotools.map.MapContext; > import org.geotools.referencing.CRS; > import org.geotools.referencing.FactoryFinder; > import org.geotools.renderer.GTRenderer; > import org.geotools.renderer.lite.StreamingRenderer; > import org.geotools.styling.*; > import org.opengis.referencing.FactoryException; > import org.opengis.referencing.crs.CRSFactory; > import org.opengis.referencing.crs.CoordinateReferenceSystem; > import org.w3c.dom.Document; > import org.w3c.dom.Node; > import org.w3c.dom.NodeList; > import org.xml.sax.SAXException; > > import javax.swing.*; > import javax.xml.parsers.DocumentBuilder; > import javax.xml.parsers.DocumentBuilderFactory; > import javax.xml.parsers.ParserConfigurationException; > import java.awt.*; > import java.awt.event.ActionEvent; > import java.awt.event.ActionListener; > import java.io.*; > import java.util.ArrayList; > import java.util.List; > > public class QuickStart { > //GUI frame, pane and extras > static JFrame frame; > static JMapPane jmp; > static JToolBar jtb; > static JLabel text; > > //Display elements > static MapContext context; > static GTRenderer renderer; > static com.vividsolutions.jts.geom.Envelope worldbounds; > > > > /** > * Create a GUI map displayer. > * <p/> > * This is all Swing stuff for the JMapPane. > */ > public static void initGUI() { > frame = new JFrame("My Map Viewer"); > // frame.setBounds(20,20,500,310); > frame.setBounds(20, 20, 1080, 600); > frame.setBackground(Color.cyan); > frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); > > Container content = frame.getContentPane(); > content.setBackground(Color.magenta); > content.setLayout(new BorderLayout()); > // content.setLayout(new GridLayout(1,2 )); > > // jmpp = new JMapPane(); > jmp = new JMapPane(); > jmp.setBackground(Color.white); > // jmp.setSize(20,100); > //jmp.addZoomChangeListener(this); > > /* TODO: Fix this TOOLBAR STUFF BELOW: */ > content.setLayout(new BorderLayout()); > jtb = new JToolBar(); > Action zoomIn = new ZoomInAction(jmp); > Action zoomOut = new ZoomOutAction(jmp); > Action pan = new PanAction(jmp); > Action select = new SelectAction(jmp); > Action reset = new ResetAction(jmp); > jtb.add(zoomIn); > jtb.add(zoomOut); > jtb.add(pan); > jtb.addSeparator(); > jtb.add(reset); > jtb.addSeparator(); > jtb.add(select); > final JButton button = new JButton(); > button.setText("CRS"); > button.setToolTipText("Change map prjection"); > button.addActionListener(new ActionListener() { > public void actionPerformed(ActionEvent e) { > > String code = JOptionPane.showInputDialog(button, > "Coordinate Reference System:", "EPSG:4326"); > try { > // CoordinateReferenceSystem crs = CRS.decode( code ); > CoordinateReferenceSystem crs = CRS.parseWKT(code); > System.out.println("crs = '" + crs + "'"); > > jmp.getContext().setAreaOfInterest(jmp.getContext().getAreaOfInterest(), > crs); > jmp.setReset(true); > jmp.repaint(); > > } > catch (FactoryException fe) { > JOptionPane.showMessageDialog(button, fe.getMessage(), > fe.getClass().toString(), JOptionPane.ERROR_MESSAGE); > return; > } > } > }); > jtb.add(button); > > content.add(jtb, BorderLayout.NORTH); > /* TOOLBAR STUFF ABOVE */ > > content.add(jmp, BorderLayout.CENTER); > // content.add(jmp); > > content.doLayout(); > frame.setVisible(true); > > } > > > private static double FACTOR = (double) 580 / (double) 420; > private static double oneKilometer = ((90. / 10000.) / FACTOR); > private static double MIN_SCALE_FACTOR = 0.11622 / oneKilometer; > private static double MAX_SCALE_FACTOR = 0.11624 / oneKilometer; > private static final double googleMaxZoom = 65000; > private static final double[] zoomLevels = { > googleMaxZoom / 1048576, googleMaxZoom / 524288, > googleMaxZoom / 262144, googleMaxZoom / 131072, googleMaxZoom / > 65536, googleMaxZoom / 32768, > googleMaxZoom / 16384, googleMaxZoom / 8192, googleMaxZoom / > 4096, googleMaxZoom / 2048, > googleMaxZoom / 1024, googleMaxZoom / 512, googleMaxZoom / 256, > googleMaxZoom / 128, > googleMaxZoom / 64, googleMaxZoom / 32, googleMaxZoom / 16, > googleMaxZoom / 8, > googleMaxZoom / 4, googleMaxZoom / 2, googleMaxZoom}; > > private static final List<MapLayer> mapLayers = new > ArrayList<MapLayer>(); > > private static void loadMapLayers(String mapLayersXmlPath) throws > IOException, IllegalFilterException { > final String destinationCharset = "cp1251"; > > DocumentBuilderFactory domFactory = > DocumentBuilderFactory.newInstance(); > domFactory.setValidating(false); > > try { > double eps = 1e-10; > DocumentBuilder builder = domFactory.newDocumentBuilder(); > > Document doc = builder.parse("resources/MapLayers.xml"); > > // String rootDir = > QuickStart.class.getResource("/").toString(); > > NodeList mapLayerTags = doc.getElementsByTagName("MapLayer"); > for (int i = 0; i < mapLayerTags.getLength(); i++) { > Node mapLayerTag = mapLayerTags.item(i); > String path = > mapLayerTag.getAttributes().getNamedItem("path").getTextContent(); > int maxScaleNum = (int) > Double.parseDouble(mapLayerTag.getAttributes().getNamedItem("maxScaleNum").getTextContent()); > double priority = > Double.parseDouble(mapLayerTag.getAttributes().getNamedItem("priority").getTextContent()); > String type = > mapLayerTag.getAttributes().getNamedItem("type").getTextContent(); > String sorceCharset = > mapLayerTag.getAttributes().getNamedItem("sorceCharset").getTextContent(); > > SourceData source; > // if ("SourceShapefilesFromArcSde".equals(type)) { > // source = new SourceShapefilesFromArcSde(rootDir + > path, sorceCharset, destinationCharset); > // } else if ("SourceMPfiles".equals(type)) { > source = new SourceMPfiles(path, sorceCharset, > destinationCharset); > // } else if ("SourceShapefiles".equals(type)) { > // source = new SourceShapefiles(rootDir + path, > sorceCharset, destinationCharset); > // } else { > // throw new IllegalArgumentException("Unknown MapLayer > type"); > // } > > System.out.println("======Creating MapLayer from: '" + > source.getPath() + "'"); > > List<Layer> layers = new ArrayList<Layer>(); > NodeList layerTags = mapLayerTag.getChildNodes(); > for (int j = 0; j < layerTags.getLength(); j++) { > Node layerTag = layerTags.item(j); > if (!"Layer".equals(layerTag.getNodeName())) { > continue; > } > > String file = > layerTag.getAttributes().getNamedItem("file").getTextContent(); > String filter = > layerTag.getAttributes().getNamedItem("filter").getTextContent(); > String pathToStyle = > layerTag.getAttributes().getNamedItem("pathToStyle").getTextContent(); > try { > layers.add(new Layer(source, file, filter, > // createStyle(servletContext, > servletContext.getRealPath(pathToStyle)), > createStyle(pathToStyle), > pathToStyle)); > } catch (Throwable e) { > System.out.println("Can not create Layer[" + > source.getPath() + ", " + file + ", " + filter + ", " + pathToStyle + "]"); > } > } > > // mapLayersManager.addLayer(new MapLayer(source.getPath(), > layers, zoomLevels[maxScaleNum] + eps, priority)); > mapLayers.add(new MapLayer(source.getPath(), layers, > zoomLevels[maxScaleNum] + eps, priority)); > > System.out.println("======/MapLayer from: '" + > source.getPath() + "' successfully created."); > } > } catch (ParserConfigurationException e) { > throw new IllegalArgumentException("'" + mapLayersXmlPath + "' > is invalid!", e); > } catch (SAXException e) { > throw new IllegalArgumentException("'" + mapLayersXmlPath + "' > is invalid!", e); > } > } > > private static Style createStyle(String path) throws IOException { > SLDParser sldParser = new SLDParser(new > StyleBuilder().getStyleFactory()); > > File f = new File(path); > // log.info("Loading style from: '" + f.getPath() + "'"); > FileReader is = new FileReader(f); > BufferedReader br = new BufferedReader(is); > > String styleXml = "", line, link = "xlink:href=\""; > //setup links on images > while ((line = br.readLine()) != null) { > int ind = line.indexOf(link); > if (ind >= 0) { > String tmp = line.substring(ind + link.length()); > int ind2 = tmp.indexOf("\""); > if (ind2 >= 0) { > tmp = tmp.substring(0, ind2); > // String realPath = servletContext.getResource("/" + > tmp).toString(); > String realPath = "resources/" + tmp; > line = line.replace(tmp, realPath); > } > } > styleXml += line; > } > br.close(); > is.close(); > > sldParser.setInput(new StringReader(styleXml)); > Style style = sldParser.readXML()[0]; > > //setup MinScaleDenominator and MaxScaleDenominator > for (FeatureTypeStyle featureTypeStyle : > style.getFeatureTypeStyles()) { > if (featureTypeStyle == null || featureTypeStyle.getRules() == > null) { > continue; > } > for (Rule rule : featureTypeStyle.getRules()) { > if (rule == null) { > continue; > } > double min = rule.getMinScaleDenominator(); > double max = rule.getMaxScaleDenominator(); > int minI = (int) min, maxI = (int) max; > minI = zoomLevels.length <= minI ? zoomLevels.length - 1 : > minI < 0 ? 0 : minI; > maxI = zoomLevels.length <= maxI ? zoomLevels.length - 1 : > maxI < 0 ? 0 : maxI; > rule.setMinScaleDenominator(zoomLevels[minI] * > MIN_SCALE_FACTOR); > rule.setMaxScaleDenominator(zoomLevels[maxI] * > MAX_SCALE_FACTOR); > // > rule.setMaxScaleDenominator(zoomLevels[zoomLevels.length-1] * > RenderConst.MAX_SCALE_FACTOR); > // rule.setMinScaleDenominator(0); > // rule.setMaxScaleDenominator(1e25); > } > } > return style; > } > > /** > * Display features onto the screen. > * <p/> > * This is a very crude example, showing only how do display a map. The > * core class, JMapPane, also has a toolbar which is not shown here. See > * the demo/gui for more details. > */ > public static void loadGUI() throws Exception { > > //Setup the context and renderer within the jmappane > context = new DefaultMapContext(); //WGS84 by default //TODO: make > mercator > //Trying to make Mercator > CRSFactory crsFactory = FactoryFinder.getCRSFactory(null); > String wkt = "PROJCS[\"Mercator_1SP\", " > + "GEOGCS[\"WGS84\", " > + "DATUM[\"WGS84\", " > + "SPHEROID[\"WGS84\", 6378137.0, 298.257223563]], " > + "PRIMEM[\"Greenwich\", 0.0], " > + "UNIT[\"degree\",0.017453292519943295], " > + "AXIS[\"Longitude\",EAST], " > + "AXIS[\"Latitude\",NORTH]], " > + "PROJECTION[\"Mercator_1SP\"], " > + "PARAMETER[\"semi_major\", 6378137.0], " > + "PARAMETER[\"semi_minor\", 6356752.314245179], " > + "PARAMETER[\"central_meridian\", 0.0], " > + "PARAMETER[\"scale_factor\", 1.0], " > + "PARAMETER[\"false_easting\", 0.0], " > + "PARAMETER[\"false_northing\", 0.0], " > + "UNIT[\"metre\",1.0], " > + "AXIS[\"x\",EAST], " > + "AXIS[\"y\",NORTH]]"; > CoordinateReferenceSystem prjCRS = null; > try { > prjCRS = crsFactory.createFromWKT(wkt); > System.out.println("prjCRS = '" + prjCRS + "'"); > } catch (FactoryException fe) { > System.err.println("On prjCRS creation a FactoryException :" + > fe.getMessage()); > } > Envelope e = new Envelope(-170.0, 170.0, -80.0, 80.0); > context.setAreaOfInterest(e, prjCRS); > > > renderer = new StreamingRenderer(); > jmp.setRenderer(renderer); > jmp.setContext(context); > > //Add the data directly to the context (which makes the MapLayers) > for (MapLayer mapLayer : mapLayers) { > mapLayer.applyLayer(context); > } > > //Set boundary to all that's visible > jmp.setMapArea(context.getLayerBounds()); > // jmp.setMapArea(e); > > jmp.setHighlightLayer(context.getLayer(0)); > > // jmp.setSize(200,600); > frame.repaint(); > frame.doLayout(); > // Thread.sleep(5000); > // jmp.setSize(200,600); > // frame.repaint(); > // frame.doLayout(); > > } > > /** > * This is main() the only real function in this QuickStart tutorial. > * The class works sequentially through every step > * > * @param args > */ > public static void main(String[] args) throws Exception { > System.out.println("QuickStart: Tutorial Start..."); > > System.out.println("\tStart: Create FeatureSource from scratch."); > loadMapLayers(""); > System.out.println("\t End: Created FeatureSource from scratch."); > > System.out.println("\tStart: Initialize the GUI."); > initGUI(); > System.out.println("\t End: Initialized the GUI."); > > System.out.println("\tStart: Load the map."); > loadGUI(); > System.out.println("\t End: Loaded the map."); > > System.out.println("QuickStart: Tutorial End."); > } > > } > ------------------------------------------------------------------------- > Check out the new SourceForge.net Marketplace. > It's the best place to buy or sell services for > just about anything Open Source. > > http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace > _______________________________________________ > Geotools-gt2-users mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users > > ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace _______________________________________________ Geotools-gt2-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users
