A API do Google Civics é a melhor solução. Um único hit na API oferece a você funcionários e distritos eleitos.
Você pode obter distritos por cabos de GPS (lat / lng) da seguinte forma:
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
Você pode obter informações semelhantes em nível de estado usando o OpenStates :
"http://openstates.org/api/v1/legislators/geo/?apikey={0}&lat={1}&long={2}";
Adendos sobre a API do Google Civics caindo frequentemente
A API do Google Civics é vaga sobre se ela suporta lat / lng e, a cada poucos meses, apenas para de suportar lat / lng por mais ou menos um mês, até que alguém a relate e o Google perceba, ou mais especificamente, o funcionário provavelmente trabalhando nisso em seus avisos de voluntariado ("Chelan") e procura corrigi-lo:
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
Se o seu serviço espera que os dados da API do Civics falhem, e se exige que os dados da API do Civics sejam úteis, ele pode não falhar, mas será inútil por meses. A falha mais recente foi todo o período de votação para a maioria dos estados em 2018, portanto, esse é o tempo de inatividade.
Você pode jogar defesa invertendo explicitamente a geocodificação:
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);
Então, aqui, analisamos o HTML5 usual, solicitando a localização do usuário e, se ele disser Não / Bloquear, mostramos a mensagem "Não foi possível obter sua localização" (com geoFail). Em seguida, temos o lat / lng, mas a API do Google Civics é irregular, portanto solicitaremos explicitamente o endereço ao Google. Isso volta como r [0] .formatted_address, que em algumas respostas o Google recomenda que você mostre ao usuário para confirmar o local que está pesquisando. Então colocamos isso na caixa de texto do endereço e enviamos via loadReps(lat, lng, address)
.
Observe que é possível que a chamada do geocódigo possa falhar (inclusive por causa de uma conexão com a Internet inadequada), mas, às vezes, a API do Google Civics está totalmente operacional, portanto, não é necessário negar ao usuário um resultado ainda neste cenário; o back-end que escrevi neste caso pode aceitar lat / lng e endereço opcional e tolerar o endereço ausente. Em seguida, ele tenta conversar com a API do Google Civics e, se não receber nada, precisa sobreviver a isso e informar ao usuário que a API do Civics está com defeito, desculpe.
Resposta Histórica
A API do Congresso da Sunlight Foundation * é apenas federal - sem nível estadual, se isso for importante para você. E [a Sunlight Foundation está encerrando, porque eles não querem duplicar os esforços do GovTrack.
A API do GovTrack * é mais completa. O deles /role
é o mais próximo da sua pergunta:
https://www.govtrack.us/developers/api#endpoint_role
Ele informa todos os atuais senadores e membros da Câmara e quando é a próxima eleição. Então você teria um fardo de filtragem.
Para coisas em nível de estado, você deseja o OpenStates.org, como:
http://openstates.org/api/v1/legislators/geo/?apikey= {0} & lat = {1} & long = {2}
https://openstates.org/
* Más notícias, tudo está desligando o tempo todo. A Sunlight Foundation encerrou sua API para evitar duplicar o trabalho de Govtrack. O Govtrack está encerrando o deles agora , para evitar duplicar o trabalho do ProPublica. Mas o Propublica's não parece fornecer distrito a partir da localização:
https://projects.propublica.org/api-docs/congress-api/
Então, espere, você pode dizer que isso não faz sentido, porque o site Represent do ProPublica , que é transferido do projeto Represent do encerramento do NYTimes, permite mapear um endereço e obter o distrito pelas cordas do GPS. E eles vinculam à API a partir dessa página. Bem enganado, porque essa página não usa sua API. De fato, ele usa a API de localização de distritos da Sunlight Foundation.
Que bagunça.