package org.androad.sys.ors.lus.openrouteservice; import java.util.Formatter; import java.util.Locale; import junit.framework.Assert; import org.osmdroid.util.GeoPoint; import org.androad.sys.ors.adt.lus.Country; import org.androad.sys.ors.adt.lus.ICountrySubdivision; import org.androad.sys.ors.adt.lus.ReverseGeocodePreferenceType; import org.androad.sys.ors.util.Util; import org.androad.sys.ors.util.constants.ORSXMLConstants; import android.content.Context; public class OpenRouteServiceLUSRequestComposer implements ORSXMLConstants { /** * <pre><?xml version="1.0" encoding="UTF-8"?> * <xls:XLS xmlns:xls="http://www.opengis.net/xls" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd" version="1.1"> * <xls:RequestHeader/> * <xls:Request methodName="ReverseGeocodeRequest" requestID="123456789" version="1.1"> * <xls:ReverseGeocodeRequest> * <xls:Position> * <gml:Point srsName="4326"> * <gml:pos>8.7520131 49.4515134</gml:pos> * </gml:Point> * </xls:Position> * <xls:ReverseGeocodePreference>StreetAddress</xls:ReverseGeocodePreference> * </xls:ReverseGeocodeRequest> * </xls:Request> * </xls:XLS></pre> */ public static String reverseGeocode(final Context ctx, final GeoPoint aGeoPoint, final ReverseGeocodePreferenceType aPreferenceType){ Assert.assertNotNull(aGeoPoint); Assert.assertNotNull(aPreferenceType); final StringBuilder sb = new StringBuilder(); final Formatter f = new Formatter(sb, Locale.ENGLISH); sb.append(XML_BASE_TAG_UTF8) .append(XLS_OPENGIS_LOCATIONUTILITYSERVICE_TAG_OPEN); f.format(XLS_REQUESTHEADER_TAG, Util.getORSClientName(ctx)); sb.append(XLS_REQUESTMETHOD_REVERSEGEOCODE_TAG_OPEN) .append(XLS_REVERSEGEOCODEREQUEST_TAG_OPEN); sb.append(XLS_POSITION_TAG_OPEN) .append(GML_POINT_TAG_OPEN); f.format(GML_POS_TAG, aGeoPoint.getLongitudeE6() / 1E6, aGeoPoint.getLatitudeE6() / 1E6); sb.append(GML_POINT_TAG_CLOSE) .append(XLS_POSITION_TAG_CLOSE); f.format(XLS_REVERSEGEOCODEPREFERENCE_TAG, aPreferenceType.mDefinedName); sb.append(XLS_REVERSEGEOCODEREQUEST_TAG_CLOSE) .append(XLS_REQUESTMETHOD_REVERSEGEOCODE_TAG_CLOSE) .append(XLS_OPENGIS_LOCATIONUTILITYSERVICE_TAG_CLOSE); return sb.toString(); } /** * <pre><?xml version="1.0" encoding="UTF-8"?> * <xls:XLS xmlns:xls="http://www.opengis.net/xls" xmlns:sch="http://www.ascc.net/xml/schematron" * xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd" version="1.1"> * <xls:RequestHeader/> * <xls:Request methodName="GeocodeRequest" requestID="123456789" version="1.1"> * <xls:GeocodeRequest> * <xls:Address countryCode="DE"> * <xls:StreetAddress> * <xls:Street>Mannheimer Strasse</xls:Street> * </xls:StreetAddress> * <xls:Place type="Municipality">Schriesheim</xls:Place> * </xls:Address> * </xls:GeocodeRequest> * </xls:Request> * </xls:XLS></pre> * @param nat * @param pCity * @param pStreetName * @param pStreetNumber * @return */ public static String createStreetaddressCityRequest(final Context ctx, final Country nat, final ICountrySubdivision pCountrySubdivision, final String pCity, String pStreetName, final String pStreetNumber){ if(pStreetName == null) { pStreetName = ""; // empty streetname is like searching for the town only. } Assert.assertNotNull(nat); Assert.assertTrue(pStreetNumber == null || (pStreetNumber != null && pStreetNumber.length() > 0)); // null or at least 1 char final StringBuilder sb = new StringBuilder(); final Formatter f = new Formatter(sb, Locale.ENGLISH); appendBaseRequestStart(ctx, nat, sb, f); sb.append(XLS_STREETADDRESS_TAG_OPEN); if(pStreetNumber != null){ f.format(XLS_BUILDING_TAG, pStreetNumber); } f.format(XLS_STREET_TAG, pStreetName); sb.append(XLS_STREETADDRESS_TAG_CLOSE); if(pCountrySubdivision != null){ f.format(XLS_PLACE_COUNTRYSUBDIVISION_TAG, pCountrySubdivision.getAbbreviation()); } f.format(XLS_PLACE_MUNICIPALITY_TAG, pCity); appendBaseRequestEnd(sb, f); return sb.toString(); } /** * <pre><xls:XLS xmlns:xls="http://www.opengis.net/xls" xmlns:sch="http://www.ascc.net/xml/schematron" * xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd" version="1.1"> * <xls:RequestHeader/> * <xls:Request methodName="GeocodeRequest" requestID="123456789" version="1.1"> * <xls:GeocodeRequest> * <xls:Address countryCode="DE"> * <xls:StreetAddress> * <xls:Street>Mannheimer strasse</xls:Street> * </xls:StreetAddress> * <xls:PostalCode>69198</xls:PostalCode> * </xls:Address> * </xls:GeocodeRequest> * </xls:Request> * </xls:XLS></pre> * @param nat * @param pCountrySubdivision * @param pCity * @param pStreetName * @param pStreetNumber * @return */ public static String createStreetaddressPostalcodeRequest(final Context ctx, final Country nat, final ICountrySubdivision pCountrySubdivision, final String pPostalCode, String pStreetName, final String pStreetNumber){ if(pStreetName == null) { pStreetName = ""; // empty streetname is like searching for the town only. } Assert.assertNotNull(nat); Assert.assertTrue(pStreetNumber == null || (pStreetNumber != null && pStreetNumber.length() > 0)); // null or at least 1 char final StringBuilder sb = new StringBuilder(); final Formatter f = new Formatter(sb, Locale.ENGLISH); appendBaseRequestStart(ctx, nat, sb, f); sb.append(XLS_STREETADDRESS_TAG_OPEN); if(pStreetNumber != null){ f.format(XLS_BUILDING_TAG, pStreetNumber); } f.format(XLS_STREET_TAG, pStreetName); sb.append(XLS_STREETADDRESS_TAG_CLOSE); if(pCountrySubdivision != null){ f.format(XLS_PLACE_COUNTRYSUBDIVISION_TAG, pCountrySubdivision); } f.format(XLS_POSTALCODE_TAG, pPostalCode); appendBaseRequestEnd(sb, f); return sb.toString(); } /** * @return xml-request String. i.e.: * <pre><?xml version="1.0" encoding="UTF-8"?> * <xls:XLS xmlns:xls="http://www.opengis.net/xls" xmlns:sch="http://www.ascc.net/xml/schematron" * xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/LocationUtilityService.xsd" version="1.1"> * <xls:RequestHeader/> * <xls:Request methodName="GeocodeRequest" requestID="123456789" version="1.1"> * <xls:GeocodeRequest> * <xls:Address countryCode="DE"> * <xls:freeFormAddress>bonn maximilianstrasse</xls:freeFormAddress> * </xls:Address> * </xls:GeocodeRequest> * </xls:Request> * </xls:XLS></pre> */ public static String createFreeformAddressRequest(final Context ctx, final Country nat, final String freeFormAddress){ Assert.assertNotNull(freeFormAddress); Assert.assertTrue(freeFormAddress.length() > 0); final StringBuilder sb = new StringBuilder(); final Formatter f = new Formatter(sb, Locale.ENGLISH); appendBaseRequestStart(ctx, nat, sb, f); f.format(XLS_FREEFORMADDRESS_TAG, freeFormAddress); appendBaseRequestEnd(sb, f); return sb.toString(); } private static void appendBaseRequestStart(final Context ctx, final Country nat, final StringBuilder sb, final Formatter f){ sb.append(XML_BASE_TAG_UTF8) .append(XLS_OPENGIS_LOCATIONUTILITYSERVICE_TAG_OPEN); f.format(XLS_REQUESTHEADER_TAG, Util.getORSClientName(ctx)); sb.append(XLS_REQUESTMETHOD_GEOCODE_TAG_OPEN) .append(XLS_GEOCODEREQUEST_TAG_OPEN); if(nat == null) { f.format(XLS_ADDRESS_TAG_OPEN, Country.UNKNOWN); } else { f.format(XLS_ADDRESS_TAG_OPEN, nat.COUNTRYCODE); } } private static void appendBaseRequestEnd(final StringBuilder sb, final Formatter f){ sb.append(XLS_ADDRESS_TAG_CLOSE) .append(XLS_GEOCODEREQUEST_TAG_CLOSE) .append(XLS_REQUESTMETHOD_GEOCODE_TAG_CLOSE) .append(XLS_OPENGIS_LOCATIONUTILITYSERVICE_TAG_CLOSE); } }