Using PTV xServer internet in Java applications (xMap)

  • While xServer internet uses HTTP basic authentication with <user>/<password>, it is highly recommended to work with the token assigned to your subscription using the combination “xtok”/<token>. Using the token is a safer way than using your far more sensible account data.

  • Get the PTV Java Client Bundle

    For this sample you are going to need the xMap client package and different third-party packages. Enter "xtok" as user and your token as password to access the download. Look at our xLocate sample to learn how to add the packages to your project.

    Download xMap client package

  • Add the code to your project

    This is a simple application which requests a map image and displays it on a window. Pay attention to the comments in the code!

package xMap_Sample;

import java.awt.Dimension;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import com.ptvag.jabba.core.exception.SystemException;
import com.ptvag.jabba.service.baseservices.CallerContext;
import com.ptvag.jabba.service.baseservices.CallerContextProperty;
import com.ptvag.jabba.service.baseservices.ClientFactory;
import com.ptvag.jabba.service.baseservices.RemoteType;
import com.ptvag.xserver.common.BoundingBox;
import com.ptvag.xserver.common.PlainPoint;
import com.ptvag.xserver.common.Point;
import com.ptvag.xserver.common.XServiceException;
import com.ptvag.xserver.xmap.ImageInfo;
import com.ptvag.xserver.xmap.Map;
import com.ptvag.xserver.xmap.MapParams;
import com.ptvag.xserver.xmap.MapSection;
import com.ptvag.xserver.xmap.XMapException;
import com.ptvag.xserver.xmap.XMapRemoteInterface;


public class xMapSample extends JPanel {
    Dimension imageSize = new Dimension(240, 320);
    JLabel label = new JLabel("Loading ...");

    private void runSample() {

        // Step 1:
        // Create the client, setting username = "xtok", the required token and the url

        XMapRemoteInterface client = (XMapRemoteInterface)ClientFactory.createClient(
                            XMapRemoteInterface.class, RemoteType.DOCSTYLE_CXF,
                            "xtok", "<INSERT-YOUR-TOKEN-HERE",
                            "https://xmap-eu-n-test.cloud.ptvgroup.com/xmap/ws/XMap"
                        );

        // Step 2:
        // Create object MapSection
        MapSection mapSection = new MapSection();
        Point point = new Point();
        PlainPoint plainPoint = new PlainPoint();
        double x = 682007.75;
        double y = 6372537.96;


        plainPoint.setX(x);
        plainPoint.setY(y);
        point.setPoint(plainPoint);

        mapSection.setCenter(point);
        mapSection.setScale(1000);

        // Step 3:
        // Create object CallerContext
        CallerContext cxt = new CallerContext();
        cxt.setLog1("Basic Mapping");
        // Set CallerContext properties to define profile and CoordFormat
        CallerContextProperty props1 = new CallerContextProperty();
        props1.setKey("profile");
        props1.setValue("default");
        CallerContextProperty props2 = new CallerContextProperty();
        props2.setKey("CoordFormat");
        props2.setValue("PTV_MERCATOR");
        CallerContextProperty[] properties = new CallerContextProperty[]{props1, props2};
        cxt.setProperties(properties);
        client.setCallerContext(cxt);

        // Step 4:
        // Create object ImageInfo
        ImageInfo imageInfo = new ImageInfo();
        imageInfo.setHeight(240);
        imageInfo.setWidth(320);
        imageInfo.setImageParameter("");

        // Step 5:
        // Create object MapParams
        MapParams mapParams = new MapParams();
        mapParams.setShowScale(true);
        mapParams.setUseMiles(false);

        // step 6:
        // set attribute includeImageInResponse
        boolean includeImageInResponse = false;

        try {
            // Step 7:
            // Render map
            Map map = client.renderMap(mapSection, mapParams, imageInfo, null, includeImageInResponse);

            // Step 8:
            // Retrieve further map values
            BoundingBox bbox = map.getVisibleSection().getBoundingBox();
            double leftTopX = bbox.getLeftTop().getPoint().getX();
            double leftTopY =   bbox.getLeftTop().getPoint().getY();
            double rightBottomX =   bbox.getLeftTop().getPoint().getX();
            double rightBottomY =   bbox.getLeftTop().getPoint().getY();
            int scale = map.getVisibleSection().getScale();

            System.out.println(String.format("Left top corner:(%.2f/%.2f)\nRight bottom corner:(%.2f/%.2f)\nMap scale: %s",
                    leftTopX, leftTopY, rightBottomX, rightBottomY, scale));

            // Step 9:
            // Get the image
            String imageUrl = "http://" + map.getImage().getUrl();
            try {
                ImageIcon icon = new ImageIcon(new URL(imageUrl));
                label.setIcon(icon);
                label.setText("");
                this.setMinimumSize(new Dimension(icon.getIconWidth() + 20, icon.getIconHeight() + 30));
            } catch (MalformedURLException e) {
                System.err.println(e.getMessage());
            }

        } catch (SystemException se) {
            System.err.println("Network or URL problem (xmap):\n" + se);
        } catch (XMapException xme) {
            System.err.println("Problem with calculating a map\n" + xme);
        } catch (XServiceException xse) {
            System.err.println("Technical problem on xMap server\n" + xse);
        }

    }

    public xMapSample() {
        this.add(label);
        Thread thread = new Thread() {

            public void run() {
                runSample();
            }
        };
        thread.start();
    }

    public static void main(String[] args) {

        // Display image in window
        JFrame frame = new JFrame("PTV xServer internet - Basic Mapping");
        JPanel sample = new xMapSample();
        frame.getContentPane().add(sample);
        frame.setVisible(true);
        frame.pack();
        frame.setSize(340, 280);

        // Exit when window is closed
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

}
  • The output of this sample should now look like this: