L'API di Google Civics è la soluzione migliore. Un singolo colpo API ti dà sia i funzionari eletti che i distretti.
Puoi ottenere Distretti per coordinate GPS (lat / lng) in questo modo:
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
Puoi ottenere informazioni simili per informazioni a livello di stato usando OpenStates :
"http://openstates.org/api/v1/legislators/geo/?apikey={0}&lat={1}&long={2}";
Addenda sull'API di Google Civics che scende di frequente
L'API di Google Civics è vaga sul fatto che supporti lat / lng e ogni pochi mesi circa smetterà di supportare lat / lng per circa un mese, fino a quando qualcuno non lo segnalerà e Google noterà, o più specificamente, l'unico dipendente probabilmente ci stanno lavorando su nei loro avvisi di tempo volontario ("Chelan") e cerca di risolverlo:
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
Se il tuo servizio prevede che i dati dell'API di Civics andranno in crash, e se richiede che i dati dell'API di Civics siano utili, potrebbe non bloccarsi ma sarà inutile per mesi alla volta. L'errore più recente è stato l'intero periodo di votazione per la maggior parte degli stati nel 2018, quindi è piuttosto tempo di inattività.
Puoi giocare alla difesa invertendo esplicitamente il geocodifica:
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);
Quindi qui, passiamo attraverso il solito HTML5 per chiedere la posizione dell'utente e se dicono No / Block mostriamo loro il messaggio "Impossibile trovare la tua posizione" (con geoFail). Quindi abbiamo lat / lng, ma l'API di Google Civics è irregolare, quindi chiederemo esplicitamente a Google l'indirizzo. Questo ritorna come r [0] .formatted_address, che in alcune risposte Google ti consiglia di mostrare all'utente per confermare la posizione che stanno cercando. Quindi lo inseriamo nella casella di testo dell'indirizzo e lo inviamo via loadReps(lat, lng, address)
.
Tieni presente che è possibile che la chiamata con geocodice non riesca (anche a causa di una connessione Internet instabile), ma a volte l'API di Google Civics è completamente operativa, quindi non è necessario negare all'utente un risultato in questo scenario; il backend che ho scritto in questo caso può accettare lat / lng e indirizzo opzionale e tollerare l'indirizzo mancante. Quindi cerca di parlare con l'API di Google Civics e, se non ottiene nulla, deve sopravvivere e dire all'utente che l'API di Civics è rotta, mi dispiace.
Risposta storica
L'API del Congresso di Sunlight Foundation * è solo federale: nessun livello statale, se questo è importante per te. E [Sunlight Foundation si sta chiudendo, perché non vogliono duplicare gli sforzi di GovTrack.
L'API * di GovTrack è più completa. Il loro /role
è il più vicino alla tua domanda:
https://www.govtrack.us/developers/api#endpoint_role
Ti dice tutti gli attuali senatori e membri della Camera e quando saranno le loro prossime elezioni. Quindi avresti un onere di filtraggio.
Per cose a livello statale vuoi OpenStates.org, come:
http://openstates.org/api/v1/legislators/geo/?apikey= {0} & lat = {1} & long = {2}
https://openstates.org/
* Cattive notizie, tutto si spegne tutto il tempo. Sunlight Foundation ha chiuso l'API per evitare di duplicare il lavoro di Govtrack. Govtrack sta chiudendo il loro adesso , per evitare di duplicare il lavoro di ProPublica. Ma Propublica non sembra affatto darti distretto dalla posizione:
https://projects.propublica.org/api-docs/congress-api/
Quindi aspetta che tu possa dire, non ha senso, perché il sito Represent di ProPublica , che viene trasferito dal progetto Represent di spegnimento di NYTimes, ti consente di mappare un indirizzo e ottenere il distretto dai coordinate GPS. E si collegano alla loro API da quella pagina. Ben ingannato, perché quella pagina non usa la loro API. In realtà, utilizza l'API di ricerca distrettuale della Sunlight Foundation.
Che casino.