Google Civics API เป็นทางออกที่ดีที่สุด การเข้าสู่ API เดียวทำให้คุณได้รับทั้งเจ้าหน้าที่ที่ได้รับการเลือกตั้งและเขต
คุณสามารถรับย่านโดย GPS coords (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 นั้นคลุมเครือไม่ว่าจะรองรับ lat / lng และทุกๆสองสามเดือนหรือมากกว่านั้นก็จะหยุดสนับสนุน lat / lng เป็นเวลาหนึ่งเดือนหรือมากกว่านั้นจนกว่าจะมีคนรายงานและแจ้งให้ Google ทราบหรือเฉพาะเจาะจงพนักงานคนหนึ่ง อาจมีการทำงานในเรื่องนี้ในเวลาประกาศอาสาสมัครของพวกเขา ("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) จากนั้นเราก็มี lat / lng แต่ Google Civics API นั้นผิดปกติดังนั้นเราจะไปถามที่อยู่อย่างชัดเจนกับ Google ซึ่งกลับมาเป็น r [0] .formatted_address ซึ่งในบางคำตอบ Google ขอแนะนำให้คุณแสดงต่อผู้ใช้เพื่อยืนยันตำแหน่งที่พวกเขากำลังมองหา loadReps(lat, lng, address)
ดังนั้นเราจึงใส่ในช่องที่อยู่และส่งออกผ่านทาง
โปรดทราบว่าอาจเป็นไปได้ว่าการเรียกรหัสภูมิศาสตร์อาจล้มเหลว (รวมถึงเนื่องจากการเชื่อมต่ออินเทอร์เน็ตที่ไม่สม่ำเสมอ) แต่บางครั้ง Google Civics API ทำงานได้อย่างสมบูรณ์ดังนั้นจึงไม่จำเป็นต้องปฏิเสธผู้ใช้ผลลัพธ์ในสถานการณ์นี้ แบ็กเอนด์ที่ฉันเขียนในกรณีนี้สามารถยอมรับ lat / lng และที่อยู่เพิ่มเติมและยอมรับที่อยู่ที่ขาดหายไป จากนั้นจะพยายามพูดคุยกับ Google Civics API และหากไม่ได้รับอะไรก็ต้องอยู่รอดและแจ้งให้ผู้ใช้ทราบว่า Civics API นั้นใช้งานไม่ได้ขออภัยด้วย
คำตอบทางประวัติศาสตร์
Congress API จาก Sunlight Foundation * เป็นแบบสหพันธ์เท่านั้น - ไม่มีระดับรัฐหากคุณมีความสำคัญ และ [มูลนิธิ Sunlight กำลังปิดตัวลงเพราะพวกเขาไม่ต้องการทำซ้ำความพยายามของ GovTrack
API ของ GovTrack นั้นสมบูรณ์ยิ่งขึ้น พวกเขา/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/
* ข่าวร้ายทุกอย่างกำลังปิดตัวลงตลอดเวลา Sunlight Foundation ปิด API เพื่อหลีกเลี่ยงการทำงานของ Govtrack ซ้ำ Govtrack กำลังปิดตัวลงในขณะนี้เพื่อหลีกเลี่ยงการทำงานที่ซ้ำซ้อนของ ProPublica แต่ดูเหมือนว่า Propublica จะไม่ให้ตำบลจากที่ใด ๆ กับคุณ:
https://projects.propublica.org/api-docs/congress-api/
ดังนั้นรอคุณอาจพูดว่ามันไม่มีเหตุผลเพราะไซต์ตัวแทน ProPublicaซึ่งถูกถ่ายโอนจากโครงการตัวแทนปิดของ NYTimes จะช่วยให้คุณแมปที่อยู่และรับอำเภอจาก coords GPS และพวกเขาลิงก์ไปยัง API จากหน้านั้น หลอกคุณได้ดีเพราะหน้านั้นไม่ได้ใช้ API ของพวกเขา ในความเป็นจริงมันใช้ API การค้นหาอำเภอของมูลนิธิ Sunlight
ช่างเป็นระเบียบ