API công dân Google là giải pháp tốt nhất. Một lần truy cập API duy nhất giúp bạn có cả Quan chức được bầu và Quận.
Bạn có thể nhận được các Quận bằng các hợp đồng GPS (lat / lng) như vậy:
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-inif/docs/v2/interesentative/interesentativeInfoByAddress
Bạn có thể nhận được thông tin tương tự cho thông tin cấp nhà nước bằng cách sử dụng OpenStates :
"http://openstates.org/api/v1/legislators/geo/?apikey={0}&lat={1}&long={2}";
Chương trình bổ sung về API công dân Google thường xuyên đi xuống
API Google Civilics mơ hồ về việc nó có hỗ trợ lat / lng hay không, và cứ sau vài tháng, nó sẽ ngừng hỗ trợ lat / lng trong một tháng hoặc lâu hơn, cho đến khi ai đó báo cáo và Google thông báo, hay cụ thể hơn là một nhân viên có lẽ đã làm việc này trong các thông báo thời gian tình nguyện của họ ("Chelan") và xem xét sửa nó:
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
Nếu dịch vụ của bạn mong đợi dữ liệu API của Civilics sẽ bị sập và nếu nó yêu cầu dữ liệu API của Civilics là hữu ích, nó có thể không bị sập nhưng nó sẽ vô dụng trong nhiều tháng. Thất bại gần đây nhất là toàn bộ thời gian bỏ phiếu cho hầu hết các bang trong năm 2018, vì vậy, đó hoàn toàn là thời gian chết.
Bạn có thể chơi phòng thủ bằng cách mã hóa địa lý rõ ràng:
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);
Vì vậy, ở đây, chúng tôi đi qua HTML5 yêu cầu vị trí của người dùng và nếu họ nói Không / Chặn, chúng tôi sẽ hiển thị cho họ thông báo "Không thể nhận vị trí của bạn" (với GeoFail). Sau đó, chúng tôi đã có lat / lng, nhưng, Google Civilics API không ổn định nên chúng tôi sẽ hỏi Google một cách rõ ràng về địa chỉ. Điều đó trở lại là r [0] .formatted_address, trong một số câu trả lời, Google khuyên bạn nên hiển thị cho người dùng để xác nhận vị trí họ đang tìm kiếm. Vì vậy, chúng tôi đặt nó trong hộp văn bản địa chỉ và gửi nó qua loadReps(lat, lng, address)
.
Lưu ý rằng có thể cuộc gọi mã địa lý có thể thất bại (bao gồm cả do kết nối internet không ổn định), nhưng, đôi khi API Google Civilics hoạt động đầy đủ, do đó, không cần từ chối kết quả của người dùng trong kịch bản này; phần phụ trợ tôi đã viết trong trường hợp này có thể chấp nhận lat / lng và địa chỉ tùy chọn và chấp nhận địa chỉ bị thiếu. Sau đó, nó cố gắng nói chuyện với Google Civilics API và, nếu không nhận được gì, nó cần tồn tại điều đó và nói với người dùng rằng API công dân bị hỏng, xin lỗi.
Câu trả lời lịch sử
API của Đại hội từ Sunlight Foundation * chỉ dành cho Liên bang - không có cấp tiểu bang, nếu điều đó quan trọng với bạn. Và [Sunlight Foundation đang ngừng hoạt động, vì họ không muốn sao chép những nỗ lực của GovTrack.
API của GovTrack * hoàn thiện hơn. Họ /role
là gần nhất với câu hỏi của bạn:
https://www.govtrack.us/developers/api#endpoint_role
Nó cho bạn biết tất cả các Thượng nghị sĩ và thành viên Hạ viện hiện tại, và khi cuộc bầu cử tiếp theo của họ là. Vì vậy, bạn có một gánh nặng lọc.
Đối với nội dung ở cấp tiểu bang mà bạn muốn OpenStates.org, như:
http://openstates.org/api/v1/legislators/geo/?apikey= {0} & lat = {1} & long = {2}
https://openstates.org/
* Tin xấu, tất cả mọi thứ đang tắt tất cả thời gian. Sunlight Foundation đã tắt API của họ để tránh trùng lặp công việc của Govtrack. Govtrack đang đóng cửa của họ ngay bây giờ , để tránh trùng lặp công việc của ProPublica. Nhưng Propublica dường như không cung cấp cho bạn quận từ vị trí nào cả:
https://projects.propublica.org/api-docs/congress-api/
Vì vậy, chờ đợi bạn có thể nói, điều đó vô nghĩa, bởi vì trang web Đại diện của ProPublica , được chuyển từ dự án Đại diện tắt máy của NYTimes, cho phép bạn lập bản đồ địa chỉ và nhận quận từ các hợp đồng GPS. Và họ liên kết với API của họ từ trang đó. Cũng đánh lừa bạn, vì trang đó không sử dụng API của họ. Trên thực tế, nó sử dụng API tìm kiếm quận của Sunlight Foundation.
Thật là một mớ hỗn độn.