Google Civics API ist die beste Lösung. Mit einem einzigen API-Treffer erhalten Sie sowohl gewählte Beamte als auch Distrikte.
Sie können Distrikte über GPS-Koordinaten (lat / lng) wie folgt abrufen:
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
Mit OpenStates können Sie ähnliche Informationen auf Bundesstaatsebene erhalten :
"http://openstates.org/api/v1/legislators/geo/?apikey={0}&lat={1}&long={2}";
Nachträge zur Google Civics-API fallen häufig aus
Die Google Civics-API ist vage, ob sie lat / lng unterstützt, und alle paar Monate oder so wird die Unterstützung von lat / lng für etwa einen Monat eingestellt, bis jemand dies meldet und Google oder insbesondere den einen Mitarbeiter bemerkt Dort arbeiten sie wahrscheinlich in ihren freiwilligen Zeitnotizen ("Chelan") daran und prüfen, ob sie das Problem beheben können:
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
Wenn Ihr Dienst erwartet, dass Civics-API-Daten abstürzen, und wenn Civics-API-Daten nützlich sein müssen, stürzt er möglicherweise nicht ab, ist jedoch monatelang unbrauchbar. Der jüngste Misserfolg war die gesamte Abstimmungsperiode für die meisten Staaten im Jahr 2018, das ist also ziemlich die Ausfallzeit.
Sie können Verteidigung spielen, indem Sie die Geokodierung explizit umkehren:
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);
Hier gehen wir also die übliche HTML5-Frage nach dem Standort des Benutzers durch. Wenn er Nein / Block sagt, wird ihm die Meldung "Standort konnte nicht abgerufen werden" angezeigt (mit geoFail). Dann haben wir das lat / lng, aber die Google Civics-API ist unberechenbar, sodass wir Google explizit nach der Adresse fragen. Dies wird als r [0] .formatted_address zurückgegeben. In einigen Antworten empfiehlt Google, dass Sie dem Benutzer anzeigen, um den Ort zu bestätigen, nach dem er sucht. Also setzen wir das in das Adressentextfeld und senden es über ab loadReps(lat, lng, address)
.
Beachten Sie, dass der Geocode-Aufruf möglicherweise fehlschlägt (auch aufgrund einer unzuverlässigen Internetverbindung). Manchmal ist die Google Civics-API jedoch voll funktionsfähig, sodass dem Benutzer in diesem Szenario noch kein Ergebnis verweigert werden muss. Das Backend, das ich in diesem Fall geschrieben habe, kann lat / lng und optionale Adressen akzeptieren und die fehlende Adresse tolerieren. Dann wird versucht, mit der Google Civics-API zu kommunizieren. Wenn nichts angezeigt wird, muss es dies überleben und dem Benutzer mitteilen, dass die Civics-API fehlerhaft ist.
Historische Antwort
Die Kongress-API der Sunlight Foundation * ist nur auf Bundesebene verfügbar - keine staatliche Ebene, wenn dies für Sie von Bedeutung ist. Und [Sunlight Foundation wird geschlossen, weil sie die Bemühungen von GovTrack nicht duplizieren wollen.
Die API * von GovTrack ist vollständiger. Ihre /role
Frage kommt Ihrer Frage am nächsten:
https://www.govtrack.us/developers/api#endpoint_role
Es informiert Sie über alle derzeitigen Senatoren und Mitglieder des Repräsentantenhauses und darüber, wann ihre nächste Wahl stattfindet. Sie hätten also eine Filterlast.
Für Inhalte auf Bundesstaatsebene möchten Sie OpenStates.org wie:
http://openstates.org/api/v1/legislators/geo/?apikey= {0} & lat = {1} & long = {2}
https://openstates.org/
* Schlechte Nachrichten, alles wird die ganze Zeit heruntergefahren. Sunlight Foundation hat ihre API heruntergefahren, um zu vermeiden , dass Govtracks Arbeit dupliziert wird. Govtrack schließt jetzt ihre , um zu vermeiden, dass ProPublicas Arbeit dupliziert wird. Aber Propublica's scheint Ihnen überhaupt keinen Bezirk vom Standort zu geben:
https://projects.propublica.org/api-docs/congress-api/
Warten Sie also, Sie könnten sagen, das macht keinen Sinn, da Sie auf der Represent-Site von ProPublica , die aus dem heruntergefahrenen Represent-Projekt von NYTimes übertragen wurde, eine Adresse zuordnen und den Distrikt von den GPS-Koordinaten abrufen können. Und sie verlinken von dieser Seite aus auf ihre API. Gut getäuscht, weil diese Seite ihre API nicht verwendet. Tatsächlich wird die Distrikt-Finding-API der Sunlight Foundation verwendet.
Was für ein Chaos.