Google Civics API가 가장 좋은 솔루션입니다. 한 번의 API 방문으로 선출 된 공무원과 지구를 모두 얻을 수 있습니다.
다음과 같이 GPS 좌표 (lat / lng)로 지구를 구할 수 있습니다.
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
OpenStates를 사용하여 상태 수준 정보와 비슷한 것을 얻을 수 있습니다 .
"http://openstates.org/api/v1/legislators/geo/?apikey={0}&lat={1}&long={2}";
Google Civics API에 대한 부록
Google Civics API는 위도 / 경도를 지원하는지 여부에 대해 모호하며, 몇 달마다 1 개월 정도 위도 / 경도 지원을 중단합니다. 아마도 자원 봉사 시간 통지 ( "Chelan") 에서이 작업을 수행하고 수정하려고합니다.
https://groups.google.com/d/msg/google-civicinfo-api/0td48h7JxYA/Zhij3yQiCgAJ
서비스가 Civics API 데이터를 예상하면 충돌이 발생하고 Civics API 데이터가 유용해야하는 경우 충돌하지 않을 수 있지만 한 번에 몇 달 동안 쓸모가 없습니다. 가장 최근의 실패는 2018 년 대부분의 주에서 전체 투표 기간이었으며 따라서 다운 타임입니다.
명시 적으로 역 지오 코딩을 사용하여 방어를 할 수 있습니다.
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);
여기에서 일반적인 HTML5 사용자의 위치를 물어 봅니다. 아니요 / 차단이라고하면 "위치를 찾을 수 없습니다"라는 메시지가 표시됩니다 (geoFail 포함). 그런 다음 위도 / 경도를 얻었지만 Google Civics API가 불규칙하므로 Google에 주소를 명시 적으로 요청합니다. r [0] .formatted_address로 돌아옵니다. 일부 답변에서는 사용자가 찾는 위치를 확인하도록 사용자에게 보여줄 것을 권장합니다. 주소 텍스트 상자에 넣고를 통해 보내십시오 loadReps(lat, lng, address)
.
지오 코드 호출 (실제 인터넷 연결 포함)이 실패 할 수 있지만 때때로 Google Civics API가 완전히 작동하기 때문에이 시나리오에서 아직 사용자에게 결과를 거부 할 필요가 없습니다. 이 경우에 작성한 백엔드는 위도 / 경도 및 선택적 주소를 허용하고 누락 된 주소를 허용 할 수 있습니다. 그런 다음 Google Civics API와 대화하려고 시도하지만 아무것도 얻지 못하면 생존하고 사용자에게 Civics API가 손상되었다고 알려줍니다. 죄송합니다.
역사적 답변
Sunlight Foundation *의 의회 API는 연방 전용이며, 주 수준이 아니라면 귀하에게 중요합니다. 그리고 [Sunlight Foundation은 GovTrack의 노력을 복제하고 싶지 않기 때문에 문을 닫고 있습니다.
GovTrack의 API *가 더 완벽합니다. 그들의 /role
질문에 가장 가깝습니다.
https://www.govtrack.us/developers/api#endpoint_role
모든 상원 의원과 하원 의원과 다음 선거시기를 알려줍니다. 따라서 필터링 부담이 있습니다.
상태 수준의 항목의 경우 OpenStates.org를 원합니다.
http://openstates.org/api/v1/legislators/geo/?apikey= {0} & lat = {1} & long = {2}
https://openstates.org/
* 나쁜 소식, 모든 것이 항상 종료됩니다. Govtrack의 작업이 중복 되지 않도록 Sunlight Foundation에서 API를 종료했습니다 . Govtrack은 ProPublica의 작업이 중복되는 것을 피하기 위해 지금 종료하고 있습니다. 그러나 Propublica 's는 당신에게 지역을 전혀 제공하지 않는 것 같습니다 :
https://projects.propublica.org/api-docs/congress-api/
NYTimes의 Shutdown Represent 프로젝트에서 전송 된 ProPublica의 Represent site 는 주소를 매핑하고 지구를 GPS 코디네이터로부터 가져 오게 하므로 말이 안될 수도 있습니다. 그리고 해당 페이지에서 API로 연결됩니다. 그 페이지는 API를 사용하지 않습니다. 실제로 Sunlight Foundation의 지역 검색 API를 사용합니다.
엉망이야