L'API Google Civics est la meilleure solution. Un seul hit API vous permet d'obtenir à la fois des élus et des districts.
Vous pouvez obtenir des districts par des coordonnées GPS (lat / lng) comme ceci:
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
Vous pouvez obtenir des informations similaires au niveau de l'état en utilisant OpenStates :
"http://openstates.org/api/v1/legislators/geo/?apikey={0}&lat={1}&long={2}";
Addenda sur l'API Google Civics en baisse fréquente
L'API Google Civics ne sait pas si elle prend en charge lat / lng, et tous les quelques mois environ, elle cessera simplement de prendre en charge lat / lng pendant un mois environ, jusqu'à ce que quelqu'un le signale et que Google remarque, ou plus précisément, le seul employé il travaille probablement là-dessus dans leurs avis de temps de bénévolat ("Chelan") et cherche à y remédier:
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
Si votre service s'attend à ce que les données de l'API Civics se bloquent, et s'il nécessite que les données de l'API Civics soient utiles, il se peut qu'elles ne se bloquent pas, mais elles seront inutiles pendant des mois. L'échec le plus récent a été la période de vote entière pour la plupart des États en 2018, c'est donc tout à fait le temps d'arrêt.
Vous pouvez jouer à la défense en inversant explicitement le géocodage:
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);
Alors ici, nous passons par la demande habituelle HTML5 pour l'emplacement de l'utilisateur, et s'ils disent Non / Bloquer, nous leur montrons le message "Impossible d'obtenir votre emplacement" (avec geoFail). Ensuite, nous avons le lat / lng, mais l'API Google Civics est erratique, nous allons donc demander explicitement à Google l'adresse. Cela revient sous la forme r [0] .formatted_address, qui, dans certaines réponses, Google vous recommande de montrer à l'utilisateur pour confirmer l'emplacement qu'il recherche. Nous avons donc mis cela dans la zone de texte de l'adresse et l'envoyer via loadReps(lat, lng, address)
.
Notez qu'il est possible que l'appel de géocodage échoue (y compris en raison d'une connexion Internet instable), mais, parfois, l'API Google Civics est entièrement opérationnelle, donc, pas besoin de refuser à l'utilisateur un résultat pour l'instant dans ce scénario; le backend que j'ai écrit dans ce cas peut accepter lat / lng et l'adresse facultative, et tolérer l'adresse manquante. Ensuite, il essaie de parler à l'API Google Civics, et s'il n'obtient rien, il doit survivre à cela et dire à l'utilisateur que l'API Civics est cassée, désolé.
Réponse historique
L'API du Congrès de Sunlight Foundation * est uniquement fédérale - pas au niveau de l'État, si cela vous importe. Et [Sunlight Foundation ferme ses portes, car ils ne veulent pas dupliquer les efforts de GovTrack.
L'API de GovTrack * est plus complète. Leur /role
est le plus proche de votre question:
https://www.govtrack.us/developers/api#endpoint_role
Il vous informe de tous les sénateurs et membres actuels de la Chambre et de la date de leurs prochaines élections. Vous auriez donc un fardeau de filtrage.
Pour les trucs au niveau de l'état que vous voulez OpenStates.org, comme:
http://openstates.org/api/v1/legislators/geo/?apikey= {0} & lat = {1} & long = {2}
https://openstates.org/
* Mauvaise nouvelle, tout s'arrête tout le temps. Sunlight Foundation a fermé son API pour éviter de dupliquer le travail de Govtrack. Govtrack ferme le leur maintenant , pour éviter de dupliquer le travail de ProPublica. Mais Propublica ne semble pas du tout vous donner le quartier de l'emplacement:
https://projects.propublica.org/api-docs/congress-api/
Alors attendez, vous pourriez dire que cela n'a aucun sens, car le site Represent de ProPublica , qui est transféré du projet Represent de l'arrêt de NYTimes, vous permet de cartographier une adresse et d'obtenir le quartier à partir des coordonnées GPS. Et ils lient à leur API à partir de cette page. Bien trompé, car cette page n'utilise pas son API. En fait, il utilise l'API de recherche de district de la Sunlight Foundation.
Quel bordel.