Quintiq file version 2.0
|
#parent: #root
|
Method ProcessGeocodeResponse (HTTPInterface httpinterface)
|
{
|
#keys: '1[105690.0.469397562]'
|
Description: 'Process the HTTP response (in XML form) to store it in result NamedValueTree'
|
TextBody:
|
[*
|
// boon kiat Nov-7-2013 (created)
|
ticks := OS::PrecisionCounter();
|
|
library := this.LibOSM_OSMGISLibrary();
|
utils := library.LibOSM_Utils();
|
result := library.Result();
|
resultroot := result.Root();
|
|
xmldomimplementation := XMLDOMImplementation::Create();
|
geocoderesponse := xmldomimplementation.CreateDocumentFromBinaryInput( httpinterface.BinaryResult(), httpinterface.Encoding() );
|
utils.DebugDump( "geocode_response.xml", geocoderesponse );
|
utils.DebugEndTrace( "Dumping the geocode response", ticks );
|
|
ticks := OS::PrecisionCounter();
|
|
arguments := library.Arguments();
|
maxresultshandle := arguments.GetHandle( "maxresults" );
|
targetsrswkthandle := arguments.GetHandle( "targetsrswkt" );
|
argumentsroot := arguments.Root();
|
maxresults := argumentsroot.Child( maxresultshandle ).GetValueAsNumber();
|
|
geocodedaddresshandle := result.GetHandle( "geocodedaddress" );
|
countryhandle := result.GetHandle( "country" );
|
statehandle := result.GetHandle( "state" );
|
cityhandle := result.GetHandle( "city" );
|
streethandle := result.GetHandle( "street" );
|
housenumberhandle := result.GetHandle( "housenumber" );
|
postcodehandle := result.GetHandle( "postcode" );
|
matchhandle := result.GetHandle( "match" );
|
xhandle := result.GetHandle( "x" );
|
yhandle := result.GetHandle( "y" );
|
srswkthandle := result.GetHandle( "srswkt" );
|
|
if( this.Endpoint() = 'OSM-NOMINATIM' )
|
{
|
resultaddresses := geocoderesponse.GetElementsByTagName( "place" );
|
|
// Assuming fault when there is no result - QP #1459
|
if( resultaddresses.Size() = 0 )
|
{
|
utils.HandleFault_Nominatim( "Geocode", httpinterface.ASyncCallId() );
|
}
|
else
|
{
|
size := Number::Min( resultaddresses.Size(), maxresults );
|
|
coordformatsetting := utils.GetOrCorrectCoordFormatSetting();
|
coordformatwkt := LibOSM_Utils::GetCoordFormatWKT( coordformatsetting );
|
desiredcoordformatwkt := argumentsroot.ChildOrDefault( targetsrswkthandle ).GetValueAsString( "" );
|
stringtorealconverter := StringToReal::ISOConverter();
|
for ( idx := 0; idx < size; idx++ )
|
{
|
resultaddress := resultaddresses.Element( idx );
|
geocodedaddress := resultroot.AddChild( geocodedaddresshandle );
|
//Special static methods are created to retrieve the required node value, sets to default value if not present in response
|
geocodedaddress.AddChild( countryhandle, LibOSM_GeocodingServer::GetNodeOrDefaultValue( resultaddress, "country_code", "" ) );
|
geocodedaddress.AddChild( statehandle, LibOSM_GeocodingServer::GetNodeOrDefaultValue( resultaddress, "state", "" ) );
|
geocodedaddress.AddChild( cityhandle, LibOSM_GeocodingServer::GetNodeOrDefaultValue( resultaddress, "city", "" ) );
|
geocodedaddress.AddChild( streethandle, LibOSM_GeocodingServer::GetNodeOrDefaultValue( resultaddress, "road", "" ) );
|
geocodedaddress.AddChild( housenumberhandle, LibOSM_GeocodingServer::GetNodeOrDefaultValue( resultaddress, "house_number", "" ) );
|
geocodedaddress.AddChild( postcodehandle, LibOSM_GeocodingServer::GetNodeOrDefaultValue( resultaddress, "postcode", "" ) );
|
geocodedaddress.AddChild( matchhandle, LibOSM_GeocodingServer::ImportanceScoreAsMatchValue_Nominatim( stringtorealconverter.Convert( resultaddress.GetAttribute( "importance" ).NodeValue() ) ) );
|
//lon - x, lat - y
|
x := stringtorealconverter.Convert( resultaddress.GetAttribute( "lon" ).NodeValue() );
|
y := stringtorealconverter.Convert( resultaddress.GetAttribute( "lat" ).NodeValue() );
|
if ( desiredcoordformatwkt.Length() > 0 and coordformatwkt <> desiredcoordformatwkt )
|
{
|
convertedx := x;
|
convertedy := y;
|
LibOSM_Utils::Convert( coordformatwkt, x, y, desiredcoordformatwkt, convertedx, convertedy );
|
geocodedaddress.AddChild( xhandle, convertedx );
|
geocodedaddress.AddChild( yhandle, convertedy );
|
geocodedaddress.AddChild( srswkthandle, desiredcoordformatwkt );
|
}
|
else
|
{
|
geocodedaddress.AddChild( xhandle, x );
|
geocodedaddress.AddChild( yhandle, y );
|
geocodedaddress.AddChild( srswkthandle, coordformatwkt );
|
}
|
}
|
}
|
}
|
else
|
{
|
resultinfo := geocoderesponse.GetElementByTagName( "info", 0 );
|
statuscode := resultinfo.GetElementByTagName( "statusCode", 0 ).TextContent();
|
|
// Assuming fault when statuscode is not 0 - QP #1459
|
if( statuscode <> '0' )
|
{
|
utils.HandleFault_MapQuest( "Geocode", httpinterface.ASyncCallId(), resultinfo );
|
}
|
else
|
{
|
resultaddresses := geocoderesponse.GetElementsByTagName( "location" );
|
size := Number::Min( resultaddresses.Size(), maxresults );
|
|
coordformatsetting := utils.GetOrCorrectCoordFormatSetting();
|
coordformatwkt := LibOSM_Utils::GetCoordFormatWKT( coordformatsetting );
|
desiredcoordformatwkt := argumentsroot.ChildOrDefault( targetsrswkthandle ).GetValueAsString( "" );
|
stringtorealconverter := StringToReal::ISOConverter();
|
for ( idx := 0; idx < size; idx++ )
|
{
|
resultaddress := resultaddresses.Element( idx );
|
geocodedaddress := resultroot.AddChild( geocodedaddresshandle );
|
geocodedaddress.AddChild( countryhandle, resultaddress.GetElementByTagName( "adminArea1", 0 ).TextContent() ); //country
|
geocodedaddress.AddChild( statehandle, resultaddress.GetElementByTagName( "adminArea3", 0 ).TextContent() ); //state
|
geocodedaddress.AddChild( cityhandle, resultaddress.GetElementByTagName( "adminArea5", 0 ).TextContent() ); //city
|
geocodedaddress.AddChild( streethandle, resultaddress.GetElementByTagName( "street", 0 ).TextContent() );
|
//TODO - should the house number be an optional result node?
|
geocodedaddress.AddChild( housenumberhandle, "" );
|
geocodedaddress.AddChild( postcodehandle, resultaddress.GetElementByTagName( "postalCode", 0 ).TextContent() );
|
geocodedaddress.AddChild( matchhandle, LibOSM_GeocodingServer::GeocodeQualityAsMatchValue_MapQuest( resultaddress.GetElementByTagName( "geocodeQuality", 0 ).TextContent() ) );
|
//lng - x, lat - y
|
//TODO - or use displayLatLng instead?
|
x := stringtorealconverter.Convert( resultaddress.GetElementByTagName( "lng", 1 ).TextContent() );
|
y := stringtorealconverter.Convert( resultaddress.GetElementByTagName( "lat", 1 ).TextContent() );
|
if ( desiredcoordformatwkt.Length() > 0 and coordformatwkt <> desiredcoordformatwkt )
|
{
|
convertedx := x;
|
convertedy := y;
|
LibOSM_Utils::Convert( coordformatwkt, x, y, desiredcoordformatwkt, convertedx, convertedy );
|
geocodedaddress.AddChild( xhandle, convertedx );
|
geocodedaddress.AddChild( yhandle, convertedy );
|
geocodedaddress.AddChild( srswkthandle, desiredcoordformatwkt );
|
}
|
else
|
{
|
geocodedaddress.AddChild( xhandle, x );
|
geocodedaddress.AddChild( yhandle, y );
|
geocodedaddress.AddChild( srswkthandle, coordformatwkt );
|
}
|
}
|
}
|
}
|
|
utils.DebugEndTrace( "GeocodingServer.ProcessGeocodeResponse", ticks );
|
|
utils.DebugDump( "geocode_result.txt", resultroot );
|
|
library.Done();
|
*]
|
}
|