Google Places Autocomplete API does not bias for location - google-places-api

I am using the Autocomplete API to get results 'biased' for current location with the following request:
https://maps.googleapis.com/maps/api/place/autocomplete/json?input=kuli&types=(regions)&key=[KEY]
The API returns the following response:
{
"predictions" : [
{
"description" : "Kulim Kedah Malaysia",
...
"types" : [ "locality", "political", "geocode" ]
},
{
"description" : "Kuliyapitiya, North Western Province, Sri Lanka",
...
"types" : [ "locality", "political", "geocode" ]
},
{
"description" : "Kulithalai, Tamil Nadu, India",
...
"types" : [ "locality", "political", "geocode" ]
},
{
"description" : "Kuligów, Poland",
...
"types" : [ "locality", "political", "geocode" ]
},
{
"description" : "Kulin, Western Australia, Australia",
...
"types" : [ "locality", "political", "geocode" ]
}
],
"status" : "OK"
}
As you can see above, the response does not bias for location. The doc says that the IP Address is taken into account when returning "near" locations. But from the response, the Indian locations are not returned first over others (The request IP address is Indian).
Even, when I pass location parameter with lat,long, as:
https://maps.googleapis.com/maps/api/place/autocomplete/json?input=kuli&types=(regions)&location=lat,long&key=[KEY]
still the Indian results are not prioritized over other response.
How do I make the API return location 'biased' over IP address or location coordinates? Thank you for your time.

Add components to your url: &components=country:IN
https://maps.googleapis.com/maps/api/place/autocomplete/json?input=kuli&components=country:IN&types=(regions)&location=lat,long&key=[KEY]

Related

AppointmentType resource

I need to return AppointmentTypes as a FHIR resource. Unfortunately, I couldn't find it as an official FHIR resource format.
My best guess would be to create a Basic resource, like this:
{
"resourceType": "Basic",
"id" : "id-of-appointment-type",
"identifier" : [
{
"use" : "secondary",
"system" : "http://myUrl/myIdentifier",
"value" : "7"
}
],
"code" : {
"coding": [
{
"system": "http://myUrl/appointment-type",
"code": "appointment-type"
}
]
},
"text" : {
"status" : "generated",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">AppointmentType</div>"
},
"extension": [
{
"url": "http://myUrl/appointment-type-name",
"valueString": "New Patient"
},
{
"url": "http://myUrl/appointment-type-availability",
"valueBoolean": true
}
],
"meta" : {
"lastUpdated" : "2020-05-27T00:00:00.000Z"
}
}
Would this be the right way to create the AppointmentType resource?
I don't see any obvious issues, but did you evaluate using CodeSystem? You can define properties on CodeSystem codes which would be able to distinguish available from non-available appointment types - and that would work better with Appointment, where 'type' is expected to be a code.

Google places API not returning address components

My program is trying to determine the City, state, and country based on some text, for example "New york yankee stadium" I want to get New york city, NY, USA. I am using Google places API to do this. According to the documentations, the API should return a list of address component https://developers.google.com/places/web-service/details. However, right now its only returning formatted address "1 E 161st St, Bronx, NY 10451, United States".
here is my web service url
https://maps.googleapis.com/maps/api/place/textsearch/json?key=MY_KEY&query=new%20york%20yankee%20stadium
Anyone familiar with google places API that can let me know if I am not writting the right query or parameter?
{
"html_attributions" : [],
"results" : [
{
"formatted_address" : "1 E 161st St, Bronx, NY 10451, United States",
"geometry" : {
"location" : {
"lat" : 40.82964260000001,
"lng" : -73.9261745
},
"viewport" : {
"northeast" : {
"lat" : 40.83279975,
"lng" : -73.92236575000001
},
"southwest" : {
"lat" : 40.82643674999999,
"lng" : -73.93052034999999
}
}
},
"icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png",
"id" : "3d78036d61d35f48650bda737226432b57d82511",
"name" : "Yankee Stadium",
"opening_hours" : {
"open_now" : true,
"weekday_text" : []
},
"photos" : [
{
"height" : 540,
"html_attributions" : [
"\u003ca href=\"https://maps.google.com/maps/contrib/101696810905045719819/photos\"\u003eYankee Stadium\u003c/a\u003e"
],
"photo_reference" : "CoQBdwAAAIxmCLrNS_XZ2FcJqVvRVtBUlNYMBVTVKppOWBu7sICj2q70cqJARBoJlTcZpydbMTzURKWWMVJhYpVCqsnia5pjmDhjvjsTirrEnAc6gvmRYKuUwgewB9Re--FulXzXZ5DY3P9fkwIwuc4U9BJVbqHD5O-N6SbbHcqn4XHUj_OdEhCoNPZ3kiNJhxOCGdYG5O4DGhTqVfUjdq7JzasqYATvQxkL1-H3xg",
"width" : 1242
}
],
"place_id" : "ChIJcWnnWiz0wokRCB6aVdnDQEk",
"rating" : 4.4,
"reference" : "CmRRAAAA5dHiw1YmLxW60_jITBZjMiUs48L4aVUqlPnPDpN_ySa7rw8kPp04WWk0qf8mG-kkMFSNzh39lP0YwfynW54tLcY4s_EYbAPvNWTMe6wXHm_FJiVbI0Lfenyxz4yOTzunEhDgI64EWoXkQe9k45y6qP3-GhSVSdCMPPZA3joFbnYGV-bqo2e0lw",
"types" : [ "stadium", "point_of_interest", "establishment" ]
}
],
"status" : "OK"
}
Its a two step process, first search and get the place_id from google places search service,
use the returned place_id and pass it with another call to receive the individual address components,
https://maps.googleapis.com/maps/api/place/details/json?place_id=ChIJcWnnWiz0wokRCB6aVdnDQEk&key=
{"html_attributions": [],
"result": {
"address_components": [
{
"long_name": "1",
"short_name": "1",
"types": [
"street_number"
]
},
{
"long_name": "East 161st Street",
"short_name": "E 161st St",
"types": [
"route"
]
},
{
"long_name": "Concourse",
"short_name": "Concourse",
"types": [
"neighborhood",
"political"
]
},
{
"long_name": "Bronx",
"short_name": "Bronx",
"types": [
"sublocality_level_1",
"sublocality",
"political"
]
},
{
"long_name": "Bronx County",
"short_name": "Bronx County",
"types": [
"administrative_area_level_2",
"political"
]
},

Why "_links" returned for Single resource and "links" returned for retrieving collection via REST call

I have developed a REST API which can return a collection of Object or a Single Resource as per the Request. I have also added "self" link on each object Programmatically (Spring Hateos).
Link self = ControllerLinkBuilder.linkTo(TenantController.class).slash(tenant.getTenantId()).withSelfRel();
tenantResource.add(self);
When the response body is returned I am getting "_links" on single resource GET where as "links" on getting the collection. why is this difference ?
URL (GET) - http://localhost:8080/tenants
Response (it has "links")
========================
[
{
"tenantId": "56c98ebb42d34bd98763f61a",
"name": "ONGC India",
"abbreviation": "ONGC",
"description": "ONGC India is a Indian Organization",
"links": [
{
"rel": "self",
"href": "http://localhost:8080/tenants/56c98ebb42d34bd98763f61a"
}
]
}
]
==========================================================================
URL (GET) - http://localhost:8080/tenants/56c98ebb42d34bd98763f61a
Response (it has "_links")
==========================
{
"tenantId" : "56c98ebb42d34bd98763f61a",
"name" : "ONGC India",
"abbreviation" : "ONGC",
"description" : "ONGC India is a Indian Organization",
"_links" : {
"self" : {
"href" : "http://localhost:8080/tenants/56c98ebb42d34bd98763f61a"
}
}
}

Google Maps Geocoding API: How to get city/region names *consistently* in English or local language?

When I make the following request (note the language=en part!) with latitude & longitude for Warsaw, Poland,
https://maps.googleapis.com/maps/api/geocode/json?latlng=52.23,21.01&language=en
I get a result list which includes the following:
Result 3 (neighborhood):
{
"address_components" : [
{
"long_name" : "Śródmieście Północne",
"short_name" : "Śródmieście Północne",
"types" : [ "neighborhood", "political" ]
},
{
"long_name" : "Śródmieście",
"short_name" : "Śródmieście",
"types" : [ "sublocality_level_1", "sublocality", "political" ]
},
{
"long_name" : "Warszawa", <-- city in Polish
"short_name" : "Warszawa",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Warszawa",
"short_name" : "Warszawa",
"types" : [ "administrative_area_level_3", "political" ]
},
{
"long_name" : "Warszawa",
"short_name" : "Warszawa",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "mazowieckie", <-- region in Polish
"short_name" : "mazowieckie",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "Poland",
"short_name" : "PL",
"types" : [ "country", "political" ]
}
],
[...]
"place_id" : "ChIJjaxkh4rMHkcR1lza9qbbnrU",
"types" : [ "neighborhood", "political" ]
}
Result 4 (sublocality_level_1):
{
"address_components" : [
{
"long_name" : "Śródmieście",
"short_name" : "Śródmieście",
"types" : [ "sublocality_level_1", "sublocality", "political" ]
},
{
"long_name" : "Warsaw", <-- city in English
"short_name" : "Warsaw",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Warszawa",
"short_name" : "Warszawa",
"types" : [ "administrative_area_level_3", "political" ]
},
{
"long_name" : "Warszawa",
"short_name" : "Warszawa",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "Masovian Voivodeship", <-- region in English
"short_name" : "Masovian Voivodeship",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "Poland",
"short_name" : "PL",
"types" : [ "country", "political" ]
}
],
[...]
"place_id" : "ChIJ8e41PvbMHkcRit4n8qe36Ns",
"types" : [ "sublocality_level_1", "sublocality", "political" ]
},
The main problem with this is the inconsistency for the same address components (locality, administrative_area_level_1) - sometimes English (as requested), sometimes the local language. Without some other ID to know that these refer to the same administrative reality, I can't be sure of that, unless I used another source of English & local geo names and did some pattern matching.
Is there a way to get around this problem? Or could someone suggest a reverse geocoding service not having such issues?
Many thanks!
I ran into the same problem. I wrote an if/else group to grab location data in order of preference.
foreach ($data->results[0]->address_components as $stuff) {
// city
if ($stuff->types[0] == 'locality') {
$zip->locality_short = $stuff->short_name;
$zip->locality_long = $stuff->long_name;
} elseif ($stuff->types[0] == 'sublocality_level_1') {
$zip->locality_short = $stuff->short_name;
$zip->locality_long = $stuff->long_name;
} elseif ($stuff->types[0] == 'neighborhood') {
$zip->locality_short = $stuff->short_name;
$zip->locality_long = $stuff->long_name;
}
// state
if ($stuff->types[0] == 'administrative_area_level_1') {
$zip->location_short = $stuff->short_name;
$zip->location_long = $stuff->long_name;
}
// country
if ($stuff->types[0] == 'country') {
$zip->country_short = $stuff->short_name;
$zip->country_long = $stuff->long_name;
}
}

Server logs to Dojo Front end, appropriate data storage method?

Good Morning all, I am currently building a tool which scrapes a number of figures from various logs on several different servers using AUX and Shell scripts on a minute by minute basis. Currently I have scripts that produce HTML files also on a minute by minute basis so that I can look back and see the system health for any given minute. So essentially these HTML files as being used as the archiving medium, which obviously is very strange.
Taking this tool forward I am looking to build a front end on a DOJO platform which will support widgets and graphs for each of the different data sets that is gathered from the logs. I haven't used DOJO much in the past and was hoping that somebody more experienced in the technology would be able to tell me what storage medium I should be using for these simple metrics that are produced by the scripts every minute. I have heard of the JSON method but am not sure.
Thanks for your time!
Jonny
Just to follow up on this in the rare chance it may be stumbled upon by another user. I decided that JSON was definitely the way forward. Each minute I have a system that produces a JSON files like the below.
{
"DataDTS" : "2014.05.02-09:00",
"System" : "Performance Test",
"SourceServer" : "gb02qws122debx7",
"OldestData" : "2014.05.02-09:00",
"MetricData" : {
"FredHopper Direct" : {
"Small" : "FH",
"Type" : "ByMinute",
"HeaderLevels" : 1,
"Data": { "Failures":0, "Avg":"0.318", "Min":"0.306", "Max":"0.340" }
},
"Performance By Instance" : {
"Small" : "RATE",
"Type" : "ByMinute",
"HeaderLevels" : 2,
"Sections" : {
"102.01" : { "Attributes" : ["(20)"], "Data": { "Req":"999", "Avg Resp":"0.254" } },
"102.02" : { "Attributes" : ["(20)"], "Data": { "Req":"144", "Avg Resp":"0.376" } },
"103.01" : { "Attributes" : ["(20)"], "Data": { "Req":"168", "Avg Resp":"0.199" } },
"103.02" : { "Attributes" : ["(20)"], "Data": { "Req":"152", "Avg Resp":"0.283" } },
"Unallocated" : { "Attributes": [], "Data": {"Req":"87", "Avg Resp":"0.154"} },
"qws122" : { "Attributes": [], "Data": {"Tot Req":"460", "Rate PPS":"7.7"} }
}
},
"HTML Status" : {
"Small" : "HTML",
"Type" : "Status",
"HeaderLevels" : 1,
"Data" : [
{ "Code":"200", "Req":447 },
{ "Code":"206", "Req":1 },
{ "Code":"301", "Req":7 },
{ "Code":"302", "Req":5 },
{ "Code":"TOT", "Req":460 }
]
},
"Page Breakdown" : {
"Small" : "PB",
"Type" : "Status",
"HeaderLevels" : 2,
"Sections" : {
"Top 15 Average Response Times" : {
"Attributes": [],
"Data" : [
{ "URL":"men", "Req":1, "Avg Resp":"3.597", "Cached":"0.0%" },
{ "URL":"jacques-vert", "Req":1, "Avg Resp":"3.335", "Cached":"0.0%" },
{ "URL":"OrderOKView", "Req":1, "Avg Resp":"1.615", "Cached":"0.0%" },
{ "URL":"warehouse", "Req":1, "Avg Resp":"1.050", "Cached":"0.0%" }
]
},
"Top 15 Requests" : {
"Attributes": [],
"Data" : [
{ "URL":"Navigate", "Req":220, "Avg Resp":"0.372", "Cached":"26.4%" },
{ "URL":"prod", "Req":42, "Avg Resp":"0.186", "Cached":"13.5%" },
{ "URL":"sureroute-test-object.html", "Req":24, "Avg Resp":"0.001", "Cached":"0.0%" },
{ "URL":"TopCategories1", "Req":8, "Avg Resp":"0.032", "Cached":"0.0%" }
]
}
}
},
"App server CPU" : {
"Small" : "CPU",
"Type" : "ByMinute",
"HeaderLevels" : 2,
"Sections" : {
"qap302" : { "Attributes" : ["Ent:7.0", "Max:8.0", "Mem:32768MB", "Wgt:200"], "Data": { "usr%":"16.8", "iow%":"1.4", "phy":"1.8", "ent%":"25.1" } },
"qap312" : { "Attributes" : ["Ent:7.0", "Max:8.0", "Mem:32768MB", "Wgt:200"], "Data": { "usr%":"8.1", "iow%":"0.1", "phy":"0.8", "ent%":"11.0" } }
}
}
}

Resources