Google Civics API es la mejor solución. Un solo golpe de API te lleva a los funcionarios electos y a los distritos.
Puede obtener distritos por medio de coordenadas GPS (lat / lng) así:
public async Task<GoogleCivicsResult> FetchAndParseUSDistrictAsync(
decimal lat, decimal lng, string address = null)
{
string googleApiKey = App.GoogleApiKey;
string reqAddr = Uri.EscapeDataString(address ?? lat + "," + lng);
string url = "https://www.googleapis.com/civicinfo/v2/representatives?alt=json&key={0}&address={1}";
url = String.Format(url, googleApiKey, reqAddr);
var req = new HttpWebRequestAsync(url);
var data = await req.GetStringAsync();
var result = JsonConvert.DeserializeObject<GoogleCivicsResult>(data);
return result;
}
public class GoogleCivicsResult
{
public Address normalizedInput { get; set; }
public Dictionary<string, Division> divisions { get; set; }
public Office[] offices { get; set; }
public Official[] officials { get; set; }
}
public class Address
{
public string line1 { get; set; }
public string line2 { get; set; }
public string city { get; set; }
public string state { get; set; }
public string zip { get; set; }
}
public class Division
{
public string name { get; set; }
public int[] officeIndices { get; set; }
public Office[] offices { get; set; }
}
public class Office
{
// President of the United States
// United States Senate
// United States House of Representatives FL-06
// Governor
// Lieutenant Governor
// Attorney General
// Sheriff
// County Judge
// Council Chair
public string name { get; set; }
// ocd-division/country:us/state:fl/cd:6
// ocd-division/country:us/state:fl
// ocd-division/country:us/state:fl/county:volusia
public string divisionId { get; set; }
// administrativeArea1
public string[] levels { get; set; }
// legislatorUpperBody
// legislatorLowerBody
// headOfGovernment
// deputyHeadOfGovernment
public string[] roles { get; set; }
public int[] officialIndices { get; set; }
}
public class Official
{
public string name { get; set; }
public Address[] address { get; set; }
public string party { get; set; }
public string[] phones { get; set; }
public string[] urls { get; set; }
public string photoUrl { get; set; }
public Social[] channels { get; set; }
public string[] emails { get; set; }
}
public class Social
{
public string type { get; set; }
public string id { get; set; }
}
https://developers.google.com/civic-information/docs/v2/representatives/representativeInfoByAddress
Puede obtener información similar a nivel estatal con OpenStates :
"http://openstates.org/api/v1/legislators/geo/?apikey={0}&lat={1}&long={2}";
Adendas sobre el API de Google Civics que baja con frecuencia
La API de Google Civics es imprecisa sobre si admite lat / lng, y cada pocos meses, dejará de admitir lat / lng durante un mes más o menos, hasta que alguien lo informe y Google se dé cuenta, o más específicamente, el empleado probablemente esté trabajando en esto en sus avisos de tiempo voluntario ("Chelan") y considere arreglarlo:
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
Si su servicio espera que los datos de la API de Civics se bloqueen, y si requiere que la información de la API de Civics sea útil, es posible que no se bloquee, pero será inútil durante meses. El fracaso más reciente fue el período de votación completo para la mayoría de los estados en 2018, por lo que ese es el tiempo de inactividad.
Puedes jugar a la defensa explícitamente revertir la geocodificación:
if (!(navigator && navigator.geolocation))
return geoFail();
navigator.geolocation.getCurrentPosition(function (position) {
var coords = position.coords;
var lat = coords.latitude;
var lng = coords.longitude;
if (!lat || !lng)
return geoFail();
var geocoder = new google.maps.Geocoder;
geocoder.geocode({ 'location': { lat: lat, lng: lng } },
function (r, status) {
if (status !== 'OK' || !r || !r.length) {
loadReps(lat, lng);
return;
}
var address = r[0].formatted_address;
$('#address').val(address);
loadReps(lat, lng, address);
});
}, geoFail);
Entonces, aquí, revisamos la ubicación habitual del usuario de HTML5, y si dicen No / Bloquear, les mostramos el mensaje "No se pudo obtener su ubicación" (con geoFail). Luego tenemos el lat / lng, pero la API de Google Civics es errática, así que le preguntaremos a Google explícitamente la dirección. Eso vuelve como r [0] .formatted_address, que en algunas respuestas Google recomienda que le muestres al usuario para confirmar la ubicación que está buscando. Así que lo ponemos en el cuadro de texto de la dirección y lo enviamos a través de loadReps(lat, lng, address).
Tenga en cuenta que es posible que la llamada de geocodificación pueda fallar (incluso debido a una conexión a Internet débil), pero, a veces, la API de Google Civics está en pleno funcionamiento, por lo que no es necesario negarle al usuario un resultado aún en este escenario; El backend que escribí en este caso puede aceptar lat / lng y dirección opcional, y tolerar la dirección que falta. Luego intenta hablar con Google Civics API y, si no consigue nada, necesita sobrevivir y decirle al usuario que el Civics API está roto, lo siento.
Respuesta historica
La API del Congreso de Sunlight Foundation * es solo federal, no a nivel estatal, si eso es importante para usted. Y [Sunlight Foundation se está cerrando, porque no quieren duplicar los esfuerzos de GovTrack.
La API * de GovTrack es más completa. Su /rolemás cercano a su pregunta:
https://www.govtrack.us/developers/api#endpoint_role
Le informa a todos los senadores y miembros actuales de la Cámara, y cuándo es su próxima elección. Entonces tendrías una carga de filtrado.
Para cosas de nivel estatal que desea OpenStates.org, como:
http://openstates.org/api/v1/legislators/geo/?apikey= {0} & lat = {1} & long = {2}
https://openstates.org/
* Malas noticias, todo se está cerrando todo el tiempo. Sunlight Foundation cerró su API para evitar duplicar el trabajo de Govtrack. Govtrack está cerrando el suyo ahora , para evitar duplicar el trabajo de ProPublica. Pero Propublica's no parece brindarle el distrito desde su ubicación:
https://projects.propublica.org/api-docs/congress-api/
Espere, podría decir, eso no tiene sentido, porque el sitio de representación de ProPublica , que se transfiere desde el proyecto de representación de cierre de NYTimes, le permite mapear una dirección y obtener el distrito de las coordenadas GPS. Y se vinculan a su API desde esa página. Bien engañado, porque esa página no utiliza su API. De hecho, utiliza la API de búsqueda de distrito de la Fundación Sunlight.
Que desastre.