L'API di Google Civics è la soluzione migliore. Un singolo hit API ti consente di essere entrambi funzionari e distretti eletti.
Puoi ottenere distretti tramite 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; }
}
link
Puoi ottenere informazioni simili 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 frequentemente
L'API di Google Civics è vaga sul fatto che supporti lat / lng e, a distanza di qualche mese, smetterà di supportare lat / lng per circa un mese, fino a quando qualcuno non lo segnalerà e le notifiche di Google, o più specificamente, l'unico dipendente lì probabilmente sta lavorando su questo nei loro avvisi di volontariato ("Chelan") e cerca di risolverlo:
link
Se il tuo servizio si aspetta che i dati API Civics si blocchino, e se richiede che i dati API Civics siano utili, potrebbe non arrestarsi in modo anomalo ma sarà inutile per mesi alla volta. Il fallimento più recente è stato l'intero periodo di votazione per la maggior parte degli stati nel 2018, quindi, è piuttosto il tempo morto.
Puoi giocare difesa invertire esplicitamente il geocoding:
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 "Non posso ottenere la tua posizione" (con geoFail). Poi abbiamo il lat / lng, ma l'API di Google Civics è irregolare, quindi andremo a chiedere esplicitamente a Google l'indirizzo. Questo ritorna come r [0] .formatted_address, che in alcune risposte Google consiglia di mostrare all'utente per confermare la posizione che sta cercando. Quindi lo inseriamo nella casella di testo dell'indirizzo e lo inviamo tramite loadReps(lat, lng, address)
.
Tieni presente che è possibile che la chiamata geocode non abbia esito positivo (anche a causa di una connessione Internet instabile), ma a volte l'API di Google Civics è pienamente operativa, quindi non è necessario negare all'utente un risultato ancora in questo scenario; il backend che ho scritto in questo caso può accettare lat / lng e l'indirizzo opzionale, e tollerare l'indirizzo mancante. Quindi prova a parlare con l'API di Google Civics e, se non riceve nulla, deve sopravvivere e dire all'utente che l'API Civics è interrotta, mi spiace.
Risposta storica
L'API Congress di Sunlight Foundation * è solo federale - nessun livello di stato, se questo è importante per te. E [la Sunlight Foundation si sta spegnendo, perché non vogliono duplicare gli sforzi di GovTrack.
L'API di GovTrack * è più completa. Il loro /role
è più vicino alla tua domanda:
link
Ti dice tutti gli attuali senatori e membri della Camera, e quando saranno le loro prossime elezioni. Quindi avresti un carico di filtro.
Per gli elementi a livello di stato che vuoi OpenStates.org, ad esempio:
link {0} & lat = {1} & long = {2 }
link
* Cattive notizie, tutto si sta spegnendo tutto il tempo. Sunlight Foundation chiude la loro API per evitare duplicare il lavoro di Govtrack. Govtrack sta chiudendo la loro ora , per evitare di duplicare il lavoro di ProPublica. Ma Propublica non sembra affatto distrarti dal luogo:
link
Quindi, si potrebbe dire che non ha senso, perché il sito Represent di ProPublica , che viene trasferito dallo spegnimento di NYTimes. progetto, ti consente di mappare un indirizzo e ottenere il distretto dalle coordinate GPS. E collegano alla loro API da quella pagina. Ti ho ingannato, perché la pagina non usa la loro API. In effetti, utilizza l'API di ricerca distretto di Sunlight Foundation.
Che casino.