บริการการเข้ารหัสพิกัดภูมิศาสตร์

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

ภาพรวม

การเข้ารหัสพิกัดภูมิศาสตร์ คือกระบวนการแปลงที่อยู่ (เช่น "1600 Amphitheatre Parkway, Mountain View, CA") ให้เป็นพิกัดทางภูมิศาสตร์ (เช่น ละติจูด 37.423021 และลองจิจูด -122.083739) ซึ่งคุณใช้เพื่อวางตําแหน่งหรือวางตําแหน่งแผนที่ได้

การระบุพิกัดทางภูมิศาสตร์แบบย้อนกลับคือกระบวนการแปลงพิกัดทางภูมิศาสตร์ให้เป็นที่อยู่ที่มนุษย์อ่านได้ (ดูการระบุพิกัดทางภูมิศาสตร์แบบย้อนกลับ (การค้นหาที่อยู่))

นอกจากนี้ คุณยังสามารถใช้รหัสพิกัดเพื่อค้นหาที่อยู่ของรหัสสถานที่ที่ระบุได้ด้วย

Maps JavaScript API มีคลาส Geocoder สําหรับการระบุพิกัดทางภูมิศาสตร์ และการเข้ารหัสพิกัดภูมิศาสตร์แบบย้อนกลับจากอินพุตของผู้ใช้แบบไดนามิก แต่หากคุณต้องการระบุพิกัดที่อยู่คงที่ที่รู้จัก โปรดดูบริการเว็บพิกัดทางภูมิศาสตร์

เริ่มต้นใช้งาน

ก่อนใช้บริการ Geocoding ใน Maps JavaScript API ก่อน ให้ตรวจสอบว่าได้เปิดใช้ Geocoding API ใน Google Cloud Console ในโปรเจ็กต์เดียวกับที่คุณตั้งค่าสําหรับ Maps JavaScript API

วิธีดูรายการ API ที่เปิดใช้

  1. ไปที่ Google Cloud Console
  2. คลิกปุ่มเลือกโปรเจ็กต์ แล้วเลือกโปรเจ็กต์เดียวกับที่คุณตั้งค่าไว้สําหรับ Maps JavaScript API แล้วคลิกเปิด
  3. จากรายการ API ในหน้าแดชบอร์ด ให้มองหา API การระบุพิกัดทางภูมิศาสตร์
  4. หากเห็น API ในรายการ นั่นหมายความว่าทุกอย่างพร้อมแล้ว หากไม่อยู่ในรายการ API ให้เปิดใช้โดยทําดังนี้
    1. ที่ด้านบนของหน้า ให้เลือกเปิดใช้ API เพื่อแสดงแท็บไลบรารี หรือเลือกคลังจากเมนูด้านซ้าย
    2. ค้นหา Geocoding API แล้วเลือกจากรายการผลลัพธ์
    3. เลือกเปิดใช้ เมื่อเสร็จสิ้นกระบวนการ API การเข้ารหัสจะปรากฏขึ้นในรายการ API ในหน้าแดชบอร์ด

ราคาและนโยบาย

ฝ่ายกำหนดราคา

ตั้งแต่วันที่ 16 กรกฎาคม 2018 เป็นต้นไป แผนการตั้งราคาแบบจ่ายเมื่อใช้แบบใหม่จะมีผลสําหรับ Maps, Routes และ Places ดูข้อมูลเพิ่มเติมเกี่ยวกับราคาใหม่และขีดจํากัดการใช้งานสําหรับบริการการเข้ารหัสพิกัด JavaScript ได้ที่การใช้งานและการเรียกเก็บเงินสําหรับ Geocoding API

ขีดจำกัดอัตรา

โปรดทราบข้อมูลต่อไปนี้เกี่ยวกับขีดจํากัดอัตราคําขอเพิ่มเติม

ขีดจํากัดอัตราเพิ่มเติมจะมีผลต่อเซสชันผู้ใช้ ไม่ว่าผู้ใช้จะแชร์โปรเจ็กต์เดียวกันกี่คน เมื่อโหลด API เป็นครั้งแรก ระบบจะจัดสรรโควต้าคําขอเริ่มต้น เมื่อคุณใช้โควต้านี้ API จะบังคับใช้ขีดจํากัดอัตราคําขอเพิ่มเติมต่อวินาที หากมีการส่งคําขอมากเกินไปภายในระยะเวลาที่กําหนด API จะส่งรหัสการตอบกลับ OVER_QUERY_LIMIT

ขีดจํากัดอัตราต่อเซสชันจะป้องกันการใช้บริการฝั่งไคลเอ็นต์สําหรับคําขอแบบกลุ่ม เช่น การระบุพิกัดทางภูมิศาสตร์แบบกลุ่ม สําหรับคําขอแบบกลุ่ม ให้ใช้บริการเว็บ Geocoding API

นโยบาย

การใช้บริการการเข้ารหัสภูมิศาสตร์ต้องเป็นไปตามนโยบายที่อธิบายเกี่ยวกับ Geocoding API

คําขอการเข้ารหัสพิกัดภูมิศาสตร์

การเข้าถึงบริการ Geocoding จะเกิดขึ้นไม่พร้อมกัน เนื่องจาก Google Maps API ต้องเรียกไปยังเซิร์ฟเวอร์ภายนอก ด้วยเหตุนี้ คุณจึงต้องส่งเมธอด backback (คําขอเรียกกลับ) เพื่อดําเนินการตามคําขอให้เสร็จสมบูรณ์ เมธอดเรียกกลับนี้จะประมวลผลผลลัพธ์ โปรดทราบว่าระบบพิกัดทางภูมิศาสตร์อาจแสดงผลการค้นหามากกว่า 1 รายการ

คุณเข้าถึงบริการที่ระบุพิกัดทางภูมิศาสตร์ของ Google Maps API ภายในโค้ดของคุณผ่านออบเจ็กต์เครื่องมือสร้าง google.maps.Geocoder เมธอด Geocoder.geocode() เริ่มคําขอไปยังบริการการเข้ารหัสภูมิศาสตร์ และส่งต่อออบเจ็กต์สัญพจน์ GeocoderRequest ที่มีคําที่ป้อนและวิธีเรียกกลับเพื่อเรียกใช้เมื่อได้รับการตอบกลับ

ออบเจ็กต์ของ GeocoderRequest ตามตัวอักษรจะมีช่องต่อไปนี้

{
 address: string,
 location: LatLng,
 placeId: string,
 bounds: LatLngBounds,
 componentRestrictions: GeocoderComponentRestrictions,
 region: string
}

พารามิเตอร์ที่จําเป็น: คุณต้องระบุช่องต่อไปนี้ 1 ช่อง และเพียงช่องเดียว

  • address — ที่อยู่ที่ต้องการให้ระบุพิกัดทางภูมิศาสตร์
    หรือ
    locationLatLng (หรือ LatLngLiteral) ที่คุณต้องการให้ได้รับที่อยู่ที่มนุษย์อ่านได้ใกล้เคียงที่สุด ระบบพิกัดทางภูมิศาสตร์จะทํารหัสพิกัดย้อนกลับ ดูการระบุพิกัดแบบย้อนกลับสําหรับข้อมูลเพิ่มเติม
    หรือ
    placeId — รหัสสถานที่ของสถานที่ที่คุณต้องการทราบที่อยู่ที่มนุษย์อ่านได้ใกล้ที่สุด ดูเพิ่มเติมเกี่ยวกับการดึงข้อมูลที่อยู่สําหรับรหัสสถานที่

พารามิเตอร์ที่ไม่บังคับ

  • boundsLatLngBounds ที่ภายในการให้น้ําหนักผลลัพธ์รหัสพิกัดที่เด่นชัดมากขึ้น พารามิเตอร์ bounds จะส่งผลต่อผลลัพธ์ทั้งที่ตัวจํากัดพิกัดเท่านั้น แต่ไม่จํากัดเฉพาะ ดูข้อมูลเพิ่มเติมเกี่ยวกับการให้น้ําหนักวิวพอร์ตด้านล่าง
  • componentRestrictions — ใช้เพื่อจํากัดผลลัพธ์เฉพาะพื้นที่ที่เจาะจง ดูข้อมูลเพิ่มเติมเกี่ยวกับการกรองคอมโพเนนต์ด้านล่าง
  • region — รหัสภูมิภาคที่ระบุเป็นแท็กย่อย Unicode แบบ 2 อักขระ (ไม่ใช่ตัวเลข) ในกรณีส่วนใหญ่ แท็กเหล่านี้แมปกับค่า ccTLD ("โดเมนระดับบนสุด") ที่คุ้นเคยโดยตรง พารามิเตอร์ region จะส่งผลต่อผลลัพธ์ทั้งที่ตัวจํากัดพิกัดเท่านั้น ดูข้อมูลเพิ่มเติมเกี่ยวกับการให้น้ําหนักรหัสภูมิภาคด้านล่าง

คําตอบที่ระบุพิกัดทางภูมิศาสตร์

บริการการเข้ารหัสพิกัดทางภูมิศาสตร์ต้องการวิธีเรียกกลับเพื่อเรียกใช้เมื่อมีการดึงผลลัพธ์รหัสพิกัด โค้ดเรียกกลับนี้ควรส่งพารามิเตอร์ 2 รายการเพื่อเก็บโค้ด results และโค้ด status ตามลําดับ

ผลการระบุพิกัดทางภูมิศาสตร์

ออบเจ็กต์ GeocoderResult แสดงถึงผลลัพธ์การระบุพิกัดทางภูมิศาสตร์รายการเดียว คําขอรหัสพิกัดภูมิศาสตร์อาจส่งคืนออบเจ็กต์ผลลัพธ์หลายรายการ ดังนี้

results[]: {
 types[]: string,
 formatted_address: string,
 address_components[]: {
   short_name: string,
   long_name: string,
   postcode_localities[]: string,
   types[]: string
 },
 partial_match: boolean,
 place_id: string,
 postcode_localities[]: string,
 geometry: {
   location: LatLng,
   location_type: GeocoderLocationType
   viewport: LatLngBounds,
   bounds: LatLngBounds
 }
}

โปรดดูคําอธิบายช่องต่อไปนี้

  • types[] คืออาร์เรย์ที่ระบุประเภทที่อยู่ของผลลัพธ์ที่แสดงผล อาร์เรย์นี้มีชุดแท็กอย่างน้อย 0 แท็กที่ระบุประเภทของฟีเจอร์ที่แสดงผล เช่น ระบบพิกัดทางภูมิศาสตร์ของ "Chicago" Return "local" ที่ระบุว่า "Chicago" เป็นเมือง และยังแสดง "political" ซึ่งระบุว่าเป็นหน่วยงานทางการเมือง ดูข้อมูลเพิ่มเติมเกี่ยวกับประเภทที่อยู่และประเภทคอมโพเนนต์ที่อยู่ด้านล่าง
  • formatted_address คือสตริงซึ่งมีที่อยู่ที่มนุษย์อ่านได้ในสถานที่นี้

    บ่อยครั้งที่ที่อยู่นี้เทียบเท่ากับที่อยู่ไปรษณีย์ โปรดทราบว่าบางประเทศ เช่น สหราชอาณาจักร ไม่อนุญาตการเผยแพร่ที่อยู่จริงทางไปรษณีย์เนื่องจากข้อจํากัดในการอนุญาตให้ใช้สิทธิ

    ที่อยู่ที่จัดรูปแบบจะประกอบด้วยส่วนประกอบที่อยู่อย่างน้อย 1 รายการ ตัวอย่างเช่น ที่อยู่ "111 8th Avenue, New York, NY" ประกอบด้วยองค์ประกอบต่อไปนี้: "111" (หมายเลขถนน) "8th Avenue" (เส้นทาง) "New York" (เมือง) และ "NY" (รัฐของสหรัฐฯ)

    อย่าแยกวิเคราะห์ที่อยู่ที่มีการจัดรูปแบบแบบเป็นโปรแกรม คุณควรใช้คอมโพเนนต์ที่อยู่แต่ละรายการแทน ซึ่งการตอบกลับ API จะมีอยู่นอกเหนือจากช่องที่อยู่ที่จัดรูปแบบ

  • address_components[] คืออาร์เรย์ที่มีคอมโพเนนต์แยกต่างหากที่ใช้กับที่อยู่นี้

    โดยทั่วไป คอมโพเนนต์ที่อยู่แต่ละรายการจะมีช่องต่อไปนี้

    • types[] คืออาร์เรย์ที่ระบุประเภทของคอมโพเนนต์ที่อยู่ ดูรายการ ประเภทที่รองรับ
    • long_name คือคําอธิบายข้อความทั้งหมดหรือชื่อของคอมโพเนนต์ที่อยู่ที่ Geocoder แสดงผล
    • short_name เป็นชื่อย่อของคอมโพเนนต์ที่อยู่ (หากมี) เช่น คอมโพเนนต์ที่อยู่ของรัฐอะแลสกาอาจมี long_name ของ "Alaska" และ short_name ของ "AK" โดยใช้ตัวย่อรหัสไปรษณีย์ 2 ตัวอักษร

    โปรดทราบข้อเท็จจริงต่อไปนี้เกี่ยวกับอาร์เรย์ address_components[]

    • อาร์เรย์ของคอมโพเนนต์ที่อยู่อาจมีคอมโพเนนต์มากกว่า formatted_address
    • อาร์เรย์ไม่ได้รวมเอนทิตีทางการเมืองทั้งหมดที่มีที่อยู่ ยกเว้นเอนทิตีที่รวมอยู่ใน formatted_address หากต้องการดึงข้อมูลเอนทิตีทางการเมืองทั้งหมดซึ่งมีที่อยู่หนึ่งๆ คุณควรใช้การระบุพิกัดทางภูมิศาสตร์แบบย้อนกลับ ซึ่งจะส่งละติจูด/ลองจิจูดของที่อยู่เป็นพารามิเตอร์ไปยังคําขอดังกล่าว
    • เราไม่รับประกันว่ารูปแบบของการตอบกลับจะคงความเหมือนเดิมระหว่างคําขอ โดยเฉพาะอย่างยิ่ง จํานวนของ address_components จะแตกต่างกันไปตามที่อยู่ที่ขอ และอาจเปลี่ยนแปลงได้เมื่อเวลาผ่านไปสําหรับที่อยู่เดียวกัน คอมโพเนนต์อาจเปลี่ยนตําแหน่งในอาร์เรย์ ประเภทของคอมโพเนนต์เปลี่ยนแปลงได้ คอมโพเนนต์เฉพาะอาจหายไปในการตอบกลับในภายหลัง

    ดูข้อมูลเพิ่มเติมเกี่ยวกับประเภทที่อยู่และประเภทคอมโพเนนต์ที่อยู่ด้านล่าง

  • partial_match บ่งบอกว่าเครื่องมือแสดงเส้นทางไม่แสดงผลลัพธ์ที่ตรงกันทุกประการกับคําขอเดิม แม้ว่าจะจับคู่กับที่อยู่ที่ขอได้บางส่วน คุณอาจต้องตรวจสอบคําขอเดิมที่สะกดผิดและ/หรือที่อยู่ที่ไม่สมบูรณ์

    การจับคู่บางส่วนมักจะเกิดขึ้นสําหรับที่อยู่ที่ไม่มีอยู่ในพื้นที่ที่คุณส่งในคําขอ ระบบอาจแสดงผลการจับคู่บางส่วนเมื่อคําขอตรงกับสถานที่ 2 แห่งขึ้นไปในพื้นที่เดียวกัน ตัวอย่างเช่น "Hillpar St, Bristol, UK" จะแสดงผลผลลัพธ์ที่ตรงกันบางส่วนสําหรับทั้ง ถนน Henry Street และ Henrietta Street โปรดทราบว่าหากคําขอมีคอมโพเนนต์ที่อยู่ที่สะกดผิด บริการเข้ารหัสภูมิศาสตร์อาจแนะนําที่อยู่อื่นให้ คําแนะนําที่ทริกเกอร์ด้วยวิธีนี้จะมีการทําเครื่องหมายว่าเป็นรายการที่ตรงกันบางส่วนด้วย

  • place_idเป็นตัวระบุที่ไม่ซ้ํากันของสถานที่ 1 รายการซึ่งใช้กับ Google API อื่นๆ ได้ ตัวอย่างเช่น คุณอาจใช้ place_id ที่มีไลบรารี Google Places API เพื่อดูรายละเอียดของธุรกิจในพื้นที่ เช่น หมายเลขโทรศัพท์ เวลาทําการ รีวิวของผู้ใช้ และอื่นๆ ดูภาพรวมรหัสสถานที่
  • postcode_localities[] เป็นอาร์เรย์ที่แสดงถึงย่านทั้งหมดที่อยู่ในรหัสไปรษณีย์ และจะแสดงเมื่อผลลัพธ์เป็นรหัสไปรษณีย์ที่มีหลายพื้นที่เท่านั้น
  • geometry มีข้อมูลต่อไปนี้

    • location มีค่าละติจูด,ลองจิจูดและลองจิจูด โปรดทราบว่าเราแสดงผลตําแหน่งนี้เป็นออบเจ็กต์ LatLng ไม่ใช่สตริงจัดรูปแบบ
    • location_type เก็บข้อมูลเพิ่มเติมเกี่ยวกับตําแหน่งที่ระบุ ปัจจุบันระบบรองรับค่าต่อไปนี้
      • ROOFTOP หมายความว่าผลลัพธ์ที่แสดงมีรหัสพิกัดที่ถูกต้อง
      • RANGE_INTERPOLATED บ่งชี้ว่าผลลัพธ์ที่ส่งคืนมานั้นเป็นค่าประมาณ (มักจะอยู่บนถนน) ที่อยู่ระหว่างจุด 2 จุดที่แน่นอน (เช่น ทางแยก) โดยทั่วไปแล้ว ระบบจะแสดงผลการค้นหาที่มีการแทรกแซงเมื่อข้อมูลทางภูมิศาสตร์บนชั้นดาดฟ้าไม่พร้อมใช้งานสําหรับที่อยู่
      • GEOMETRIC_CENTER บ่งชี้ว่าผลการค้นหาที่แสดงเป็นจุดศูนย์กลางของผลการค้นหา เช่น เส้น (เช่น ถนน) หรือรูปหลายเหลี่ยม (ภูมิภาค)
      • APPROXIMATE บ่งชี้ว่าผลลัพธ์ที่แสดงเป็นค่าประมาณ

    • viewport จัดเก็บวิวพอร์ตที่แนะนําสําหรับผลการค้นหาที่แสดง
    • bounds (มีหรือไม่มีก็ได้) จะเก็บ LatLngBounds ซึ่งอาจมีผลลัพธ์ทั้งหมดที่แสดงผล โปรดทราบว่าขอบเขตเหล่านี้อาจไม่ตรงกับวิวพอร์ตที่แนะนํา (เช่น ซานฟรานซิสโก ได้แก่ หมู่เกาะแฟราลอน ซึ่งในทางเทคนิคของเมืองนี้ แต่ไม่ควรแสดงผลในวิวพอร์ต)

ที่อยู่จะส่งกลับมาโดย Geocoder โดยใช้การตั้งค่าภาษาของเบราว์เซอร์หรือภาษาที่ระบุเมื่อโหลด JavaScript JavaScript โดยใช้พารามิเตอร์ language (ดูข้อมูลเพิ่มเติมที่หัวข้อการแปล)

ประเภทที่อยู่และประเภทส่วนประกอบที่อยู่

อาร์เรย์ types[] ใน GeocoderResult ระบุประเภทที่อยู่ นอกจากนี้ อาจมีการแสดงอาร์เรย์ types[] ภายใน GeocoderAddressComponent เพื่อระบุประเภทของคอมโพเนนต์ที่อยู่ที่เจาะจง ที่อยู่ที่แสดงโดยโปรแกรมพิกัดภูมิศาสตร์อาจมีหลายประเภท ซึ่งประเภทเหล่านี้อาจเป็นแท็ก ตัวอย่างเช่น เมืองหลายแห่งติดแท็กด้วยประเภท political และ locality

ระบบรองรับและแสดงที่อยู่ประเภทดังกล่าวทั้งในประเภทที่อยู่และประเภทองค์ประกอบที่อยู่ต่อไปนี้

  • street_address หมายถึงที่อยู่ที่ถูกต้อง
  • route หมายถึงเส้นทางที่ตั้งชื่อ (เช่น "US 101")
  • intersection หมายถึงทางแยกหลัก โดยทั่วไปจะเป็นถนนสายหลัก 2 สาย
  • political หมายถึงหน่วยงานทางการเมือง ปกติแล้ว ประเภทนี้จะระบุรูปหลายเหลี่ยมของเขตการปกครองพลเรือน
  • country แสดงถึงหน่วยงานทางการเมืองแห่งชาติ และโดยปกติแล้วจะเป็นประเภทลําดับสูงสุดที่ได้รับจาก Geocoder
  • administrative_area_level_1 ระบุเอนทิตีลําดับแรกที่ต่ํากว่าระดับประเทศ ในสหรัฐอเมริกา ระดับการดูแลระบบเหล่านี้คือรัฐ บางประเทศอาจไม่มีระดับการจัดการเหล่านี้ ในกรณีส่วนใหญ่ ชื่อย่อ admin_area_level_1 จะตรงกับการแยกย่อย ISO 3166-2 และรายการอื่นๆ ที่มีการเผยแพร่กันอย่างแพร่หลาย อย่างไรก็ตาม วิธีนี้ไม่รับประกันว่าผลลัพธ์ที่ได้จากการเข้ารหัสข้อมูลจะขึ้นอยู่กับสัญญาณและข้อมูลตําแหน่งที่หลากหลาย
  • administrative_area_level_2 ระบุเอนทิตีลําดับที่ 2 ต่ํากว่าระดับประเทศ ในสหรัฐอเมริกา ระดับการดูแลระบบเหล่านี้เป็นเคาน์ตี บางประเทศอาจไม่มีระดับการจัดการเหล่านี้
  • administrative_area_level_3 ระบุเอนทิตีลําดับที่ 3 ต่ํากว่าระดับประเทศ ประเภทนี้บ่งชี้ว่าเป็นแผนกย่อยๆ บางประเทศอาจไม่มีระดับการจัดการเหล่านี้
  • administrative_area_level_4 ระบุเอนทิตีลําดับที่ 4 ต่ํากว่าระดับประเทศ ประเภทนี้บ่งชี้ว่าเป็นแผนกย่อยๆ บางประเทศอาจไม่มีระดับการจัดการเหล่านี้
  • administrative_area_level_5 ระบุเอนทิตีลําดับที่ 5 ต่ํากว่าระดับประเทศ ประเภทนี้บ่งชี้ว่าเป็นแผนกย่อยๆ บางประเทศอาจไม่มีระดับการจัดการเหล่านี้
  • administrative_area_level_6 ระบุเอนทิตีลําดับที่ 6 ที่ต่ํากว่าระดับประเทศ ประเภทนี้บ่งชี้ว่าเป็นแผนกย่อยๆ บางประเทศอาจไม่มีระดับการจัดการเหล่านี้
  • administrative_area_level_7 ระบุเอนทิตีลําดับที่ 7 ด้านล่างระดับประเทศ ประเภทนี้บ่งชี้ว่าเป็นแผนกย่อยๆ บางประเทศอาจไม่มีระดับการจัดการเหล่านี้
  • colloquial_area ระบุชื่อทางเลือกที่องค์กรใช้โดยทั่วไป
  • locality หมายถึงหน่วยงานทางการเมืองของเมือง
  • sublocality แสดงถึงเอนทิตีลําดับแรกด้านล่างย่าน ในบางพื้นที่อาจได้รับประเภทเพิ่มเติมดังนี้ sublocality_level_1 ถึง sublocality_level_5 ระดับย่อยระดับย่อยเป็นเอนทิตีโยธา ตัวเลขยิ่งมากยิ่งหมายถึงพื้นที่ทางภูมิศาสตร์ที่เล็กลง
  • neighborhood หมายถึงย่านใกล้เคียงที่มีชื่อ
  • premise แสดงถึงตําแหน่งที่มีชื่อ โดยปกติแล้วจะเป็นอาคารหรือคอลเล็กชันอาคารที่มีชื่อทั่วไป
  • subpremise ระบุเอนทิตีคําสั่งซื้อแรกด้านล่างสถานที่ตั้งที่มีชื่อ ซึ่งมักจะเป็นอาคารเอกพจน์ภายในกลุ่มอาคารที่มีชื่อเดียวกัน
  • plus_code หมายถึงการอ้างอิงตําแหน่งที่เข้ารหัสซึ่งมาจากละติจูดและลองจิจูด Plus Codes สามารถใช้แทนที่อยู่ที่อยู่ในที่ที่ยังไม่มีที่อยู่ได้ (ในกรณีที่ไม่มีหมายเลขอาคารหรือไม่มีชื่อถนน) ดูรายละเอียดได้ที่ https://plus.codes
  • postal_code ระบุรหัสไปรษณีย์ที่ใช้เพื่อส่งไปรษณีย์ภายในประเทศ
  • natural_feature แสดงถึงลักษณะทางธรรมชาติที่โดดเด่น
  • airport แสดงถึงสนามบิน
  • park หมายถึงสวนที่มีชื่อ
  • point_of_interest หมายถึงจุดสนใจที่มีชื่อ โดยปกติ &;quot;POI" เป็นองค์กรท้องถิ่นที่มีชื่อเสียงที่เข้ากับหมวดหมู่อื่นได้ง่าย เช่น "Empire State Building" หรือ "Eiffel Tower"

รายการประเภทที่ว่างเปล่าจะบ่งบอกว่าไม่มีคอมโพเนนต์ที่รู้จักสําหรับคอมโพเนนต์ที่อยู่หนึ่งๆ เช่น Lieu-dit ในฝรั่งเศส

นอกเหนือจากข้อความข้างต้น คอมโพเนนต์ที่อยู่อาจรวมประเภทด้านล่างไว้ด้วย

หมายเหตุ: รายการนี้ยังไม่ครบถ้วนสมบูรณ์และอาจมีการเปลี่ยนแปลง

  • floor หมายถึงชั้นของที่อยู่อาคาร
  • โดยทั่วไป establishment จะระบุสถานที่ที่ยังไม่ได้จัดหมวดหมู่
  • landmark หมายถึงสถานที่ใกล้เคียงที่ใช้เป็นข้อมูลอ้างอิงเพื่อช่วยนําทาง
  • point_of_interest หมายถึงจุดสนใจที่มีชื่อ
  • parking หมายถึงที่จอดรถหรือโครงสร้างที่จอดรถ
  • post_box หมายถึงตู้ไปรษณีย์ที่เฉพาะเจาะจง
  • postal_town ระบุการจัดกลุ่มพื้นที่ทางภูมิศาสตร์ เช่น locality และ sublocality ที่ใช้สําหรับที่อยู่จัดส่งในบางประเทศ
  • room หมายถึงห้องของที่อยู่อาคาร
  • street_number หมายถึงหมายเลขถนนที่ถูกต้อง
  • bus_station, train_station และ transit_station ระบุตําแหน่งของรถประจําทาง รถไฟ หรือขนส่งสาธารณะ

รหัสสถานะ

โค้ด status อาจแสดงผลค่าใดค่าหนึ่งต่อไปนี้

  • "OK" หมายความว่าไม่มีข้อผิดพลาดเกิดขึ้น ระบบแยกวิเคราะห์ที่อยู่ได้สําเร็จและแสดงพิกัดทางภูมิศาสตร์อย่างน้อย 1 รายการ
  • "ZERO_RESULTS" บ่งบอกว่ารหัสพิกัดสําเร็จ แต่ไม่พบผลลัพธ์ กรณีนี้อาจเกิดขึ้นถ้าโปรแกรมเมอร์ส่ง address ที่ไม่มีอยู่
  • "OVER_QUERY_LIMIT" ระบุว่าคุณใช้พื้นที่เก็บข้อมูลเกินโควต้าแล้ว
  • "REQUEST_DENIED" บ่งบอกว่าคําขอของคุณถูกปฏิเสธ หน้าเว็บไม่ได้รับอนุญาตให้ใช้พิกัดทางภูมิศาสตร์
  • โดยทั่วไปแล้ว "INVALID_REQUEST" จะระบุว่าไม่มีคําค้นหา (address, components หรือ latlng)
  • "UNKNOWN_ERROR" บ่งบอกว่าประมวลผลคําขอไม่ได้เนื่องจากมีข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์ คําขออาจประสบความสําเร็จหากคุณลองอีกครั้ง
  • "ERROR" บ่งบอกว่าคําขอหมดเวลาหรือเกิดปัญหาในการติดต่อเซิร์ฟเวอร์ของ Google คําขออาจประสบความสําเร็จหากคุณลองอีกครั้ง

ในตัวอย่างนี้ เราจะใส่ที่อยู่และใส่เครื่องหมายระบุตําแหน่งที่ค่าละติจูดและลองจิจูดที่ส่งกลับ โปรดทราบว่าระบบจะส่งผ่านเครื่องจัดการเป็นสัญพจน์ของฟังก์ชันที่ไม่ระบุตัวตน

  var geocoder;
  var map;
  function initialize() {
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var mapOptions = {
      zoom: 8,
      center: latlng
    }
    map = new google.maps.Map(document.getElementById('map'), mapOptions);
  }

  function codeAddress() {
    var address = document.getElementById('address').value;
    geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == 'OK') {
        map.setCenter(results[0].geometry.location);
        var marker = new google.maps.Marker({
            map: map,
            position: results[0].geometry.location
        });
      } else {
        alert('Geocode was not successful for the following reason: ' + status);
      }
    });
  }

<body onload="initialize()">
 <div id="map" style="width: 320px; height: 480px;"></div>
  <div>
    <input id="address" type="textbox" value="Sydney, NSW">
    <input type="button" value="Encode" onclick="codeAddress()">
  </div>
</body>

ดูตัวอย่าง

การให้น้ําหนักวิวพอร์ต

คุณสามารถสั่งให้บริการ Geocoding ต้องการผลลัพธ์ภายในวิวพอร์ตที่ระบุ (แสดงเป็นช่องกรอบ) เมื่อตั้งค่าพารามิเตอร์ bounds ภายในสัญพจน์ของออบเจ็กต์ GeocoderRequest เพื่อกําหนดขอบเขตของวิวพอร์ตนี้ โปรดทราบว่าการให้น้ําหนักพิเศษจะจํากัดผลลัพธ์ภายในขอบเขตเท่านั้น หากมีผลลัพธ์ที่เกี่ยวข้องมากกว่าขอบเขตเหล่านี้ ขอบเขตเหล่านี้อาจรวมอยู่

ตัวอย่างเช่น รหัสพิกัดทางภูมิศาสตร์สําหรับ "Winnetka" โดยทั่วไปจะแสดงเขตชานเมืองของชิคาโก:

{
  "types":["locality","political"],
  "formatted_address":"Winnetka, IL, USA",
  "address_components":[{
    "long_name":"Winnetka",
    "short_name":"Winnetka",
    "types":["locality","political"]
  },{
    "long_name":"Illinois",
    "short_name":"IL",
    "types":["administrative_area_level_1","political"]
  },{
    "long_name":"United States",
    "short_name":"US",
    "types":["country","political"]
  }],
  "geometry":{
    "location":[ -87.7417070, 42.1083080],
    "location_type":"APPROXIMATE"
  },
  "place_id": "ChIJW8Va5TnED4gRY91Ng47qy3Q"
}

อย่างไรก็ตาม การระบุพารามิเตอร์ bounds ที่กําหนดกรอบล้อมรอบสําหรับหุบเขา San Fernando ของลอสแอนเจลิสจะส่งผลให้รหัสพื้นที่นี้แสดงละแวกใกล้เคียงชื่อ "Winnetka" ในตําแหน่งนั้น

{
  "types":["sublocality","political"],
  "formatted_address":"Winnetka, California, USA",
  "address_components":[{
    "long_name":"Winnetka",
    "short_name":"Winnetka",
    "types":["sublocality","political"]
  },{
    "long_name":"Los Angeles",
    "short_name":"Los Angeles",
    "types":["administrative_area_level_3","political"]
  },{
    "long_name":"Los Angeles",
    "short_name":"Los Angeles",
    "types":["administrative_area_level_2","political"]
  },{
    "long_name":"California",
    "short_name":"CA",
    "types":["administrative_area_level_1","political"]
  },{
    "long_name":"United States",
    "short_name":"US",
    "types":["country","political"]
  }],
  "geometry":{
    "location": [34.213171,-118.571022],
    "location_type":"APPROXIMATE"
  },
  "place_id": "ChIJ0fd4S_KbwoAR2hRDrsr3HmQ"
}

การให้น้ําหนักรหัสภูมิภาค

คุณสามารถตั้งค่าบริการรหัสพิกัดภูมิศาสตร์เพื่อให้แสดงผลลัพธ์การให้น้ําหนักพิเศษกับภูมิภาคที่เจาะจงอย่างชัดแจ้ง โดยใช้พารามิเตอร์ region พารามิเตอร์นี้จะใช้รหัสภูมิภาคซึ่งระบุเป็นแท็กย่อย Unicode ภูมิภาค 2 อักขระ (ไม่ใช่ตัวเลข) แท็กเหล่านี้แมปกับ ccTLD ที่รู้จักโดยตรง ("โดเมนระดับบนสุด") ค่าอักขระ 2 ตัว เช่น "uk" in "co.uk" ในบางกรณี แท็ก region ยังรองรับรหัส ISO-3166-1 ซึ่งบางครั้งต่างจากค่า ccTLD ("GB" สําหรับ"เกรตบริเตนใหญ่)

เมื่อใช้พารามิเตอร์ region มีดังนี้

  • ระบุประเทศหรือภูมิภาคเดียวเท่านั้น ระบบจะไม่สนใจหลายค่า และอาจส่งผลให้คําขอล้มเหลว
  • ใช้เฉพาะแท็กย่อยภูมิภาค 2 อักขระ (รูปแบบ Unicode CLDR) อินพุตอื่นๆ ทั้งหมดจะทําให้เกิดข้อผิดพลาด
  • รองรับเฉพาะประเทศและภูมิภาคที่แสดงในรายละเอียดการครอบคลุมของแพลตฟอร์ม Google Maps

ส่งคําขอการระบุพิกัดทางภูมิศาสตร์ได้สําหรับทุกโดเมนที่แอปพลิเคชัน Google Maps หลักนําเสนอการระบุพิกัดทางภูมิศาสตร์ โปรดทราบว่าการให้น้ําหนักพิเศษผลการค้นหาจะเป็นผลลัพธ์สําหรับโดเมนที่ระบุเท่านั้น หากมีผลลัพธ์ที่เกี่ยวข้องมากกว่าอยู่ภายนอกโดเมนนี้ ผลลัพธ์นั้นอาจรวมอยู่ในโดเมนนั้น

เช่น พิกัดทางภูมิศาสตร์สําหรับ "Toledo" จะแสดงผลนี้ เนื่องจากโดเมนเริ่มต้นสําหรับบริการการเข้ารหัสพิกัดทางภูมิศาสตร์ตั้งค่าเป็นสหรัฐอเมริกา

{
  "types":["locality","political"],
  "formatted_address":"Toledo, OH, USA",
  "address_components":[{
    "long_name":"Toledo",
    "short_name":"Toledo",
    "types":["locality","political"]
  },{
    "long_name":"Ohio",
    "short_name":"OH",
    "types":["administrative_area_level_1","political"]
  },{
    "long_name":"United States",
    "short_name":"US",
    "types":["country","political"]
  }],
  "place_id": "ChIJeU4e_C2HO4gRRcM6RZ_IPHw"
}

รหัสทางภูมิศาสตร์สําหรับ "Toledo" ที่มีการตั้งค่าช่อง region เป็น 'es' (สเปน) จะส่งคืนเมืองของสเปน

{
  "types":["locality","political"],
  "formatted_address":"Toledo, España",
  "address_components":[{
    "long_name":"Toledo",
    "short_name":"Toledo",
    "types":["locality","political"]
  },{
    "long_name":"Toledo",
    "short_name":"TO",
    "types":["administrative_area_level_2","political"]
  },{
    "long_name":"Castilla-La Mancha",
    "short_name":"CM",
    "types":["administrative_area_level_1","political"]
  },{
    "long_name":"España",
    "short_name":"ES",
    "types":["country","political"]
  }],
  "place_id": "ChIJ8f21C60Lag0R_q11auhbf8Y"
}

การกรองคอมโพเนนต์

คุณตั้งค่าบริการ Geocoding เพื่อแสดงผลการค้นหาที่อยู่ที่จํากัดไว้เฉพาะพื้นที่ได้โดยใช้ตัวกรองคอมโพเนนต์ ระบุตัวกรองในพารามิเตอร์ componentRestrictions ค่าของตัวกรองรองรับการแก้ไขการสะกดด้วยวิธีเดียวกันและการจับคู่บางส่วนกับคําขอการเข้ารหัสพิกัดทางภูมิศาสตร์อื่นๆ

เครื่องมือแสดงบริบทจะแสดงเฉพาะผลลัพธ์ที่ตรงกับตัวกรองของทั้งหมด กล่าวคือ ระบบจะประเมินข้อกําหนดของตัวกรองเป็น "และ" ไม่ใช่ "หรือ"

ตัวกรองคอมโพเนนต์ประกอบด้วยรายการต่อไปนี้อย่างน้อย 1 รายการ

  • route ตรงกับชื่อยาวหรือแบบสั้นของเส้นทาง
  • locality จับคู่กับประเภทย่านและย่านย่อย
  • administrativeArea ตรงกับระดับของพื้นที่การดูแลระบบทั้งหมด
  • postalCode ตรงกับรหัสไปรษณีย์และคํานําหน้ารหัสไปรษณีย์
  • country ตรงกับชื่อประเทศหรือรหัสประเทศแบบ ISO 3166-1 2 ตัวอักษร หมายเหตุ: API เป็นไปตามมาตรฐาน ISO สําหรับประเทศที่กําหนด และการกรองจะทํางานได้ดีที่สุดเมื่อใช้รหัส ISO ของประเทศนั้นๆ

ตัวอย่างต่อไปนี้สาธิตการใช้พารามิเตอร์ componentRestrictions เพื่อกรองตาม country และ postalCode

function codeAddress() {
geocoder.geocode({
  componentRestrictions: {
    country: 'AU',
    postalCode: '2000'
  }
}, function(results, status) {
  if (status == 'OK') {
    map.setCenter(results[0].geometry.location);
    var marker = new google.maps.Marker({
      map: map,
      position: results[0].geometry.location
    });
  } else {
    window.alert('Geocode was not successful for the following reason: ' + status);
  }
});
}

การระบุพิกัดทางภูมิศาสตร์แบบย้อนกลับ (การค้นหาที่อยู่)

โดยทั่วไปคําว่าการระบุพิกัดทางภูมิศาสตร์จะหมายถึงการแปลที่อยู่ที่มนุษย์อ่านเข้าใจได้บนแผนที่ กระบวนการทําในทางกลับกันคือการแปลตําแหน่งบนแผนที่เป็นที่อยู่ที่มนุษย์อ่านได้ ซึ่งเรียกว่าการระบุพิกัดทางภูมิศาสตร์แบบย้อนกลับ

แทนที่จะใส่ address ที่เป็นข้อความ ให้ส่งคู่ละติจูด/ลองจิจูดในพารามิเตอร์ location ที่คั่นด้วยคอมมา

ตัวอย่างต่อไปนี้จะจัดค่าละติจูด/ลองจิจูดเป็นจุดศูนย์กลาง และจัดให้แผนที่อยู่ตรงตําแหน่งนั้น แล้วเปิดหน้าต่างข้อมูลซึ่งมีที่อยู่ที่จัดรูปแบบแล้ว

TypeScript

function initMap(): void {
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      zoom: 8,
      center: { lat: 40.731, lng: -73.997 },
    }
  );
  const geocoder = new google.maps.Geocoder();
  const infowindow = new google.maps.InfoWindow();

  (document.getElementById("submit") as HTMLElement).addEventListener(
    "click",
    () => {
      geocodeLatLng(geocoder, map, infowindow);
    }
  );
}

function geocodeLatLng(
  geocoder: google.maps.Geocoder,
  map: google.maps.Map,
  infowindow: google.maps.InfoWindow
) {
  const input = (document.getElementById("latlng") as HTMLInputElement).value;
  const latlngStr = input.split(",", 2);
  const latlng = {
    lat: parseFloat(latlngStr[0]),
    lng: parseFloat(latlngStr[1]),
  };

  geocoder
    .geocode({ location: latlng })
    .then((response) => {
      if (response.results[0]) {
        map.setZoom(11);

        const marker = new google.maps.Marker({
          position: latlng,
          map: map,
        });

        infowindow.setContent(response.results[0].formatted_address);
        infowindow.open(map, marker);
      } else {
        window.alert("No results found");
      }
    })
    .catch((e) => window.alert("Geocoder failed due to: " + e));
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    zoom: 8,
    center: { lat: 40.731, lng: -73.997 },
  });
  const geocoder = new google.maps.Geocoder();
  const infowindow = new google.maps.InfoWindow();

  document.getElementById("submit").addEventListener("click", () => {
    geocodeLatLng(geocoder, map, infowindow);
  });
}

function geocodeLatLng(geocoder, map, infowindow) {
  const input = document.getElementById("latlng").value;
  const latlngStr = input.split(",", 2);
  const latlng = {
    lat: parseFloat(latlngStr[0]),
    lng: parseFloat(latlngStr[1]),
  };

  geocoder
    .geocode({ location: latlng })
    .then((response) => {
      if (response.results[0]) {
        map.setZoom(11);

        const marker = new google.maps.Marker({
          position: latlng,
          map: map,
        });

        infowindow.setContent(response.results[0].formatted_address);
        infowindow.open(map, marker);
      } else {
        window.alert("No results found");
      }
    })
    .catch((e) => window.alert("Geocoder failed due to: " + e));
}

window.initMap = initMap;
ดูตัวอย่าง

ลองใช้ตัวอย่าง

โปรดทราบว่าในตัวอย่างก่อนหน้านี้ เราแสดงผลการค้นหาแรกโดยเลือก results[0] ระบบพิกัดทางภูมิศาสตร์ย้อนกลับมักแสดงผลลัพธ์มากกว่า 1 รายการ ที่อยู่ทางภูมิศาสตร์ไม่ได้เป็นเพียงที่อยู่ทางไปรษณีย์เท่านั้น แต่จะรวมถึงวิธีการระบุตําแหน่งทางภูมิศาสตร์ด้วย เช่น เมื่อทําการระบุพิกัดทางภูมิศาสตร์ที่จุดใดจุดหนึ่งในเมืองชิคาโก จุดที่มีไวลด์การ์ดอาจระบุว่าเป็นที่อยู่ เหมือนกับเมือง (ชิคาโก) เป็นรัฐ (อิลลินอยส์) หรือเป็นประเทศ (สหรัฐอเมริกา) ทั้งหมดเป็นที่อยู่ของระบบพิกัดทางภูมิศาสตร์ ระบบพิกัดทางภูมิศาสตร์แบบย้อนกลับจะแสดงผลผลลัพธ์เหล่านี้ทั้งหมด

รหัสพิกัดย้อนกลับจะตรงกับข้อมูลทางการเมือง (ประเทศ จังหวัด เมือง และย่านใกล้เคียง) ที่อยู่ และรหัสไปรษณีย์

ด้านล่างนี้เป็นตัวอย่างของรายการที่อยู่ที่การค้นหาด้านบนอาจแสดงผล

results[0].formatted_address: "277 Bedford Ave, Brooklyn, NY 11211, USA"
results[1].formatted_address: "Grand St/Bedford Av, Brooklyn, NY 11211, USA"
results[2].formatted_address: "Williamsburg, Brooklyn, NY, USA"
results[3].formatted_address: "Brooklyn, NY, USA"
results[4].formatted_address: "New York, NY, USA"
results[5].formatted_address: "Brooklyn, NY 11211, USA"
results[6].formatted_address: "Kings County, NY, USA"
results[7].formatted_address: "New York-Northern New Jersey-Long Island, NY-NJ-PA, USA"
results[8].formatted_address: "New York Metropolitan Area, USA"
results[9].formatted_address: "New York, USA"

ที่อยู่จะปรากฏตามลําดับที่ตรงกับมากที่สุด โดยทั่วไป ที่อยู่ที่ตรงทั้งหมดจะเป็นผลลัพธ์ที่โดดเด่นที่สุดอย่างในกรณีนี้ โปรดทราบว่าเราแสดงที่อยู่ประเภทต่างๆ ตั้งแต่ที่อยู่ที่เจาะจงมากที่สุดจนถึงเอนทิตีทางการเมืองที่เจาะจงน้อยกว่า เช่น ละแวก เมือง เขต รัฐ ฯลฯ หากต้องการจับคู่ที่อยู่ที่กว้างขึ้น คุณอาจต้องการตรวจสอบช่อง results[].types

หมายเหตุ: การระบุพิกัดทางภูมิศาสตร์แบบย้อนกลับไม่ใช่ศาสตร์ที่แน่นอน โปรแกรมพิกัดทางภูมิศาสตร์จะพยายามค้นหาตําแหน่งที่ระบุที่อยู่ได้ใกล้เคียงที่สุดภายในความคลาดเคลื่อนที่ยอมรับได้

การเรียกดูที่อยู่สําหรับรหัสสถานที่

ใส่ placeId เพื่อค้นหาที่อยู่ของรหัสสถานที่ที่ระบุ รหัสสถานที่เป็นตัวระบุที่ไม่ซ้ํากันซึ่งใช้กับ Google API อื่นๆ ได้ ตัวอย่างเช่น คุณระบุ placeId ที่ Roads API แสดงผลเพื่อรับที่อยู่สําหรับจุดที่สแนปได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับรหัสสถานที่ได้ที่ภาพรวมรหัสสถานที่

เมื่อคุณระบุ placeId คําขอต้องไม่มีช่องต่อไปนี้

  • address
  • latLng
  • location
  • componentRestrictions

ตัวอย่างต่อไปนี้จะยอมรับรหัสสถานที่ ค้นหาที่อยู่ที่เกี่ยวข้อง และเป็นศูนย์กลางของแผนที่ที่สถานที่นั้น นอกจากนี้ยังมีหน้าต่างข้อมูลแสดงที่อยู่ที่มีการจัดรูปแบบของสถานที่ที่เกี่ยวข้องด้วย ดังนี้

TypeScript

// Initialize the map.
function initMap(): void {
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      zoom: 8,
      center: { lat: 40.72, lng: -73.96 },
    }
  );
  const geocoder = new google.maps.Geocoder();
  const infowindow = new google.maps.InfoWindow();

  (document.getElementById("submit") as HTMLElement).addEventListener(
    "click",
    () => {
      geocodePlaceId(geocoder, map, infowindow);
    }
  );
}

// This function is called when the user clicks the UI button requesting
// a geocode of a place ID.
function geocodePlaceId(
  geocoder: google.maps.Geocoder,
  map: google.maps.Map,
  infowindow: google.maps.InfoWindow
) {
  const placeId = (document.getElementById("place-id") as HTMLInputElement)
    .value;

  geocoder
    .geocode({ placeId: placeId })
    .then(({ results }) => {
      if (results[0]) {
        map.setZoom(11);
        map.setCenter(results[0].geometry.location);

        const marker = new google.maps.Marker({
          map,
          position: results[0].geometry.location,
        });

        infowindow.setContent(results[0].formatted_address);
        infowindow.open(map, marker);
      } else {
        window.alert("No results found");
      }
    })
    .catch((e) => window.alert("Geocoder failed due to: " + e));
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

// Initialize the map.
function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    zoom: 8,
    center: { lat: 40.72, lng: -73.96 },
  });
  const geocoder = new google.maps.Geocoder();
  const infowindow = new google.maps.InfoWindow();

  document.getElementById("submit").addEventListener("click", () => {
    geocodePlaceId(geocoder, map, infowindow);
  });
}

// This function is called when the user clicks the UI button requesting
// a geocode of a place ID.
function geocodePlaceId(geocoder, map, infowindow) {
  const placeId = document.getElementById("place-id").value;

  geocoder
    .geocode({ placeId: placeId })
    .then(({ results }) => {
      if (results[0]) {
        map.setZoom(11);
        map.setCenter(results[0].geometry.location);

        const marker = new google.maps.Marker({
          map,
          position: results[0].geometry.location,
        });

        infowindow.setContent(results[0].formatted_address);
        infowindow.open(map, marker);
      } else {
        window.alert("No results found");
      }
    })
    .catch((e) => window.alert("Geocoder failed due to: " + e));
}

window.initMap = initMap;
ดูตัวอย่าง

ลองใช้ตัวอย่าง