// License: GPL. For details, see LICENSE file.
package cadastre_fr;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.coor.EastNorth;
import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
import org.openstreetmap.josm.io.OsmTransferException;
import org.openstreetmap.josm.io.ProgressInputStream;
public class CadastreGrabber {
private CadastreInterface wmsInterface = new CadastreInterface();
public GeorefImage grab(WMSLayer wmsLayer, EastNorth lambertMin, EastNorth lambertMax)
throws IOException, OsmTransferException {
try {
URL url = null;
if (wmsLayer.isRaster())
url = getURLRaster(wmsLayer, lambertMin, lambertMax);
else
url = getURLVector(lambertMin, lambertMax);
BufferedImage img = grab(url);
ImageModifier imageModified;
if (wmsLayer.isRaster())
imageModified = new RasterImageModifier(img);
else
imageModified = new VectorImageModifier(img, false);
return new GeorefImage(imageModified.bufferedImage, lambertMin, lambertMax, wmsLayer);
} catch (MalformedURLException e) {
throw (IOException) new IOException(tr("CadastreGrabber: Illegal url.")).initCause(e);
}
}
private static URL getURLRaster(WMSLayer wmsLayer, EastNorth lambertMin, EastNorth lambertMax) throws MalformedURLException {
// GET /scpc/wms?version=1.1&request=GetMap&layers=CDIF:PMC@QH4480001701&format=image/png&bbox=-1186,0,13555,8830&width=576&height=345&exception=application/vnd.ogc.se_inimage&styles= HTTP/1.1
final int cRasterX = CadastrePlugin.imageWidth; // keep width constant and adjust width to original image proportions
String str = CadastreInterface.BASE_URL+"/scpc/wms?version=1.1&request=GetMap";
str += "&layers=CDIF:PMC@";
str += wmsLayer.getCodeCommune();
str += "&format=image/png";
//str += "&format=image/jpeg";
str += "&bbox=";
str += wmsLayer.eastNorth2raster(lambertMin, lambertMax);
str += "&width="+cRasterX+"&height="; // maximum allowed by wms server (576/345, 800/378, 1000/634)
str += (int) (cRasterX*(wmsLayer.communeBBox.max.getY() - wmsLayer.communeBBox.min.getY())/(wmsLayer.communeBBox.max.getX() - wmsLayer.communeBBox.min.getX()));
str += "&exception=application/vnd.ogc.se_inimage&styles="; // required for raster images
Main.info("URL="+str);
return new URL(str.replace(" ", "%20"));
}
private static URL buildURLVector(String layers, String styles,
int width, int height,
EastNorth lambertMin, EastNorth lambertMax) throws MalformedURLException {
String str = CadastreInterface.BASE_URL+"/scpc/wms?version=1.1&request=GetMap";
str += "&layers="+ layers;
str += "&format=image/png";
str += "&bbox="+lambertMin.east()+",";
str += lambertMin.north() + ",";
str += lambertMax.east() + ",";
str += lambertMax.north();
str += "&width="+width+"&height="+height;
str += "&exception=application/vnd.ogc.se_inimage"; // works also without (but slower ?)
str += "&styles=" + styles;
Main.info("URL="+str);
return new URL(str.replace(" ", "%20"));
}
private static URL getURLVector(EastNorth lambertMin, EastNorth lambertMax) throws MalformedURLException {
return buildURLVector(CadastrePlugin.grabLayers, CadastrePlugin.grabStyles,
CadastrePlugin.imageWidth, CadastrePlugin.imageHeight,
lambertMin, lambertMax);
}
private BufferedImage grab(URL url) throws IOException, OsmTransferException {
wmsInterface.urlConn = (HttpURLConnection) url.openConnection();
wmsInterface.urlConn.setRequestProperty("Connection", "close");
wmsInterface.urlConn.setRequestMethod("GET");
wmsInterface.setCookie();
try (InputStream is = new ProgressInputStream(wmsInterface.urlConn, NullProgressMonitor.INSTANCE)) {
return ImageIO.read(is);
}
}
public CadastreInterface getWmsInterface() {
return wmsInterface;
}
}