Google Civics API adalah solusi terbaik. Hit API tunggal memberi Anda baik Pejabat dan Distrik Terpilih.
Anda bisa mendapatkan Distrik dengan koordinat GPS (lat / lng) seperti:
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
Anda bisa mendapatkan yang serupa untuk info tingkat negara menggunakan OpenStates :
"http://openstates.org/api/v1/legislators/geo/?apikey={0}&lat={1}&long={2}";
Tambahan tentang Google Civic API Going Down Sering
Google Civics API tidak jelas apakah mendukung lat / lng, dan setiap beberapa bulan, ia akan berhenti mendukung lat / lng selama sebulan atau lebih, sampai seseorang melaporkannya dan pemberitahuan Google, atau lebih khusus lagi, satu karyawan mungkin ada yang mengerjakan ini dalam pemberitahuan waktu sukarela mereka ("Chelan") dan berusaha memperbaikinya:
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
Jika layanan Anda mengharapkan data Civic API itu akan macet, dan jika itu membutuhkan data Civics API berguna, itu mungkin tidak macet tetapi akan sia-sia selama berbulan-bulan pada suatu waktu. Kegagalan terbaru adalah seluruh periode pemungutan suara untuk sebagian besar negara bagian di 2018, jadi, itu cukup downtime.
Anda dapat bermain pertahanan dengan membalikkan geocoding secara eksplisit:
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);
Jadi di sini, kita pergi melalui HTML5 biasa meminta lokasi pengguna, dan jika mereka mengatakan Tidak / Blok kami menunjukkan kepada mereka pesan "Tidak bisa mendapatkan lokasi Anda" (dengan geoFail). Lalu kita punya lat / lng, tetapi, Google Civics API tidak menentu sehingga kita akan bertanya kepada Google secara eksplisit tentang alamatnya. Itu muncul kembali sebagai r [0] .formatted_address, yang dalam beberapa jawaban Google menyarankan Anda tunjukkan kepada pengguna untuk mengonfirmasi lokasi yang mereka cari. Jadi kami memasukkannya ke dalam kotak teks alamat dan mengirimkannya via loadReps(lat, lng, address)
.
Perhatikan bahwa ada kemungkinan panggilan geocode bisa gagal (termasuk karena koneksi internet yang tidak stabil), tetapi, kadang-kadang Google Civics API beroperasi penuh, jadi, tidak perlu menyangkal hasil pengguna dalam skenario ini; backend yang saya tulis dalam kasus ini dapat menerima lat / lng dan alamat opsional, dan mentolerir alamat yang hilang. Kemudian ia mencoba berbicara dengan Google Civic API, dan, jika tidak mendapatkan apa-apa, ia perlu bertahan dan memberi tahu pengguna bahwa Civic API rusak, maaf.
Jawaban Historis
API Kongres dari Sunlight Foundation * hanya Federal - tidak ada tingkat negara bagian, jika itu penting bagi Anda. Dan [Yayasan Sunlight ditutup, karena mereka tidak ingin menduplikasi upaya GovTrack.
API * GovTrack lebih lengkap. Mereka /role
paling dekat dengan pertanyaan Anda:
https://www.govtrack.us/developers/api#endpoint_role
Ini memberitahu Anda semua Senator dan anggota Dewan saat ini, dan kapan pemilihan mereka berikutnya. Jadi, Anda akan memiliki beban penyaringan.
Untuk hal-hal tingkat negara Anda ingin OpenStates.org, seperti:
http://openstates.org/api/v1/legislators/geo/?apikey= {0} & lat = {1} & long = {2}
https://openstates.org/
* Berita buruk, semuanya mati setiap saat. Sunlight Foundation mematikan API mereka untuk menghindari duplikasi karya Govtrack. Govtrack sedang mematikan milik mereka sekarang , untuk menghindari duplikasi karya ProPublica. Tetapi Propublica tampaknya tidak memberi Anda kabupaten dari lokasi sama sekali:
https://projects.propublica.org/api-docs/congress-api/
Jadi tunggu, Anda mungkin berkata, itu tidak masuk akal, karena situs Representasi ProPublica , yang ditransfer dari proyek Representasi shutdown NYTimes, memungkinkan Anda memetakan alamat dan mendapatkan kabupaten dari koordinat GPS. Dan mereka menautkan ke API mereka dari halaman itu. Yah menipu Anda, karena halaman itu tidak menggunakan API mereka. Bahkan, ia menggunakan API temuan distrik Sunlight Foundation.
Berantakan sekali.