การค้นหาสถานที่: ที่อยู่เฉพาะเทียบกับธุรกิจในท้องถิ่น

ฉันกำลังสร้างแอประบุตำแหน่งสำหรับ iOS ขณะนี้ฉันมีแถบค้นหาที่สามารถใช้ค้นหาธุรกิจในท้องถิ่นได้ (เช่น พิซซ่า ปั๊มน้ำมัน ธนาคาร) ข้อความในแถบค้นหาจะถูกเพิ่มเป็นพารามิเตอร์ให้กับ URL และป้อนไปยัง Yahoo Local API ฉันต้องการใช้แถบค้นหาเดียวกันเพื่อค้นหาที่อยู่เฉพาะด้วย แต่นั่นไม่ใช่หน้าที่ของ API ฉันคิดว่าฉันต้องทำอย่างใดอย่างหนึ่ง:

A) สร้างฟังก์ชันบางอย่างที่สามารถแยกความแตกต่างระหว่างการค้นหาธุรกิจแบบกว้างและการค้นหาสถานที่เฉพาะ ส่งคำถามทางธุรกิจไปยัง API และส่งการค้นหาที่อยู่ไปยัง CLGeocoder

B) ค้นหา API ที่หลากหลายมากขึ้น

C) ทำอย่างอื่นที่ฉันยังไม่ได้พิจารณา

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


person Gabriel Ortega    schedule 10.04.2012    source แหล่งที่มา


คำตอบ (2)


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

สำหรับ B คุณอาจต้องการดูที่ Google Maps API หาก ตรงตามความต้องการของคุณ ดูเหมือนว่าจะมีความหลากหลายเกี่ยวกับพารามิเตอร์อินพุต

person Matej Bukovinski    schedule 10.04.2012
comment
Maps API เป็นความคิดที่ดี ยกเว้นว่าคุณจะต้องแสดง Google Map แก่ผู้ใช้ตาม TOS สิ่งหนึ่งที่ต้องระวังเนื่องจากฉันไม่แน่ใจว่ากาเบรียลกำลังทำสิ่งนั้นหรือไม่ - person Matt; 10.04.2012
comment
ขอบคุณสำหรับการตอบรับ ฉันได้ดำเนินการคลาสที่ใช้ Google Maps Geocoding API แล้ว มันใช้งานได้ค่อนข้างดีจนถึงตอนนี้ ฉันแค่พยายามหาวิธีจัดเรียงผลลัพธ์ ดังนั้นฉันจึงแสดงเฉพาะผลลัพธ์ที่ใกล้กับตำแหน่งของผู้ใช้มากที่สุด ตัวอย่างเช่น 22 Churchill Drive ให้ผลลัพธ์จากอาร์คันซอถึงแมสซาชูเซตส์ให้ฉัน ฉันเข้าใจว่าการเข้ารหัสทางภูมิศาสตร์จะมีความแม่นยำมากขึ้นเมื่อคุณให้ข้อมูลเพิ่มเติม แต่ฉันไม่เห็นความจำเป็นต้องส่งคืนผลลัพธ์ที่อยู่ห่างออกไปกว่า 1,000 ไมล์ - person Gabriel Ortega; 13.04.2012
comment
โอ้ ยังไงก็ตาม Matej ขอบคุณสำหรับแนวคิดการเปลี่ยน นั่นเป็นตัวเลือกที่แน่นอนหากฉันมัวแต่ยึดติดกับแถบค้นหาตำแหน่งแบบรวมศูนย์มากเกินไป - person Gabriel Ortega; 13.04.2012

+1 สำหรับคำถามที่น่าสนใจ มันเป็นคำถามเกี่ยวกับการออกแบบการเขียนโปรแกรมอย่างแน่นอน แต่ก็เกือบจะเป็นคำถาม UX ด้วยเช่นกัน

ฉันคิดว่าคุณสามารถทำทุกอย่างได้ในสาขาเดียว ฉันทำงานให้กับ SmartyStreets ซึ่งเราแยกวิเคราะห์และประมวลผลที่อยู่ ต่อไปนี้คือบางสิ่งที่ฉันได้เรียนรู้จากประสบการณ์ที่เกี่ยวข้องกับคำถามของคุณ:

  • อย่าใช้นิพจน์ทั่วไปเพื่อแยกวิเคราะห์หรือระบุที่อยู่ มันซับซ้อนเกินไป ที่อยู่มีหลากหลายรูปแบบ ดังที่ Matej กล่าว "สายอิสระ" เป็นอะไรก็ได้ สิ่งล่อใจคือการใช้ regex แต่มีวิธีที่ ชาญฉลาดกว่า
  • API ตำแหน่ง/ที่อยู่น้อยมากที่ให้คุณค่าและผลลัพธ์ที่คุณกำลังมองหา อย่างน้อยก็เป็นไปตาม TOS ของพวกเขา ตัวอย่างเช่น Google, Yahoo! และอื่นๆ กำหนดให้ต้องแสดงแผนที่ และไม่อนุญาตให้มีการสืบค้นอัตโนมัติ (เช่น ไม่มีผู้ใช้ที่เริ่มดำเนินการร้องขอ)
  • API ส่วนใหญ่ดำเนินการเฉพาะที่อยู่ การประมาณ ไม่ใช่ การยืนยัน ที่อยู่ ดังนั้นผลลัพธ์ที่คุณได้รับจึงเป็นการคาดเดาที่ดีที่สุด Google คาดเดาได้ดี แต่ผลลัพธ์อาจกลับมาดูถูกต้องแต่กลับไม่ใช่เลย ฉันเคยเห็นสิ่งนี้มามากและมันกัดฉัน Geolocation/geocoding API มีที่อยู่ แต่ก็มีข้อจำกัดเช่นกัน

ตัวอย่างเช่น: ผู้ใช้พิมพ์ POI หรือที่อยู่ลงในช่องข้อความนั้น คุณไม่แน่ใจว่าอันไหนเป็นหรือทั้งสองอย่าง และถ้าคุณได้รู้ มี POI หรือที่อยู่อยู่หรือไม่ ฉันไม่รู้จัก API (ราคาไม่แพง) ที่ทำงานทั้งสองอย่างพร้อมกัน - มี API ระดับองค์กรที่ฉันเคยเห็นมา แต่... อาจจะแพงเกินไปสำหรับเงินที่มากเกินไป นี่เป็นวิธีที่ง่ายกว่าที่ฉันจะลอง

  1. ค้นหาบริการที่ได้รับการรับรองจาก CASS เพื่อตรวจสอบที่อยู่ LiveAddress API ของ SmartyStreets (การสาธิตที่แตกต่างกันในหน้าแรก) เป็นหนึ่งในบริการดังกล่าว (มีราคาไม่แพง แม้จะฟรีสำหรับการใช้งานในปริมาณน้อยก็ตาม) แม้ว่า API จะไม่แยกวิเคราะห์ที่อยู่บรรทัดเดียวโดยตรง แต่การใช้ อัลกอริทึมนี้ (พร้อม ตัวอย่างการทำงานที่นี่) -- ง่ายกว่าใน Objective C เพราะคุณไม่ต้องยุ่งกับ JSONP เหมือนที่คุณทำใน Javascript

  2. หาก LiveAddress หรือบริการที่เทียบเท่า (ฉันขอแนะนำให้คุณทำการค้นคว้าและแจ้งให้เราทราบหากคุณมีคำถามเพิ่มเติม - ฉันยินดีที่จะช่วยเหลือ) ส่งกลับผลลัพธ์ใด ๆ แสดงว่าสตริงนั้นเป็นที่อยู่ บริการที่ได้รับการรับรอง CASS บางอย่างได้รับการเตือน จะส่งกลับที่อยู่ปลอมหรือคาดเดาได้เช่นกัน และเป็นการยากหรือเป็นไปไม่ได้ที่จะแยกความแตกต่างระหว่างบริการทั้งสอง LiveAddress จะส่งกลับเฉพาะที่อยู่ ที่ถูกต้อง เท่านั้น ดังนั้น หาก LiveAddress ส่งกลับผลลัพธ์ (โดยปกติจะเป็นผลลัพธ์แรก โดยใช้อัลกอริทึมด้านบน) สตริงนั้นต้องเป็นที่อยู่อย่างแน่นอน หรือ POI ตามด้วยที่อยู่ (และใช่ LiveAddress จะกำหนดรหัสทางภูมิศาสตร์ให้กับที่อยู่แต่ละแห่ง)

  3. หากไม่มีผลลัพธ์กลับมา แสดงว่าเป็น POI/ชื่อธุรกิจ หากแอปของคุณปฏิบัติตาม TOS ของ Google หรือ Yahoo ให้ค้นหา API ของพวกเขาเนื่องจากแอปคาดเดาได้ดีและค้นหารายการที่ตรงกันทั่วไปเกี่ยวกับสิ่งต่างๆ เช่นนั้น

อีกทางเลือกหนึ่งก็คือการค้นหา Maps API ก่อน จากนั้นจึงส่งที่อยู่ (ถ้ามี) กลับมาทาง LiveAddress เพื่อให้แน่ใจว่ามีอยู่จริงและเรียนรู้เพิ่มเติมเกี่ยวกับมัน

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

person Matt    schedule 10.04.2012
comment
ขอบคุณสำหรับการตอบกลับ ข้อมูลที่ดีที่นี่ หลักสูตรที่ฉันคิดว่าฉันจะทำตามคือการใช้ Geocoding API (Google Maps) ก่อน หากไม่สร้างผลลัพธ์ใดๆ ฉันสามารถส่งข้อความค้นหาเดียวกันไปยัง API ธุรกิจท้องถิ่น (Yahoo Local หรือ Google Places) ตัวอย่างเช่น หากผู้ใช้พิมพ์พิซซ่าที่ ควร ไม่ผ่านการค้นหารหัสภูมิศาสตร์ จากนั้นจึงส่งต่อไปยัง API ธุรกิจและแสดงผลลัพธ์ - person Gabriel Ortega; 13.04.2012
comment
ตกลง. นั่นคงจะได้ผลนะ หากคุณคิดจะโพสต์ผลลัพธ์ของคุณที่นี่เมื่อคุณได้นำไปใช้และลองใช้แล้ว ฉันอยากรู้ว่ามันทำงานได้ดีแค่ไหน เพียงจำไว้ว่าหากผู้ใช้พิมพ์ที่อยู่ คุณจะไม่แน่ใจจริงๆ ว่าที่อยู่นั้นมีอยู่จริงหรือไม่ ซึ่งส่งผลให้พิกัดหายไป - person Matt; 14.04.2012
comment
ที่นั่นถูอยู่ ฉันขึ้นอยู่กับการคาดเดาที่ดีที่สุดของ API จริงๆ ฉันเพิ่งเสร็จสิ้นการทดสอบและจนถึงตอนนี้ก็ใช้งานได้ ฉันมีชั้นเรียนสำหรับการค้นหาที่อยู่และการค้นหาธุรกิจท้องถิ่น หากการค้นหาที่อยู่ล้มเหลว ระบบจะส่งสตริงการสืบค้นไปยังการค้นหาธุรกิจท้องถิ่น ตอนนี้ฉันแน่ใจว่ามันยังพิสูจน์ไม่ครบ หากคุณค้นหาสนามบิน JFK คุณจะได้รับสนามบินและทุกสิ่งที่เกี่ยวข้อง (ลานจอดรถ JFK, รถรับ-ส่ง JFK, เนื้อพาย JFK) ฉันจะยุ่งกับมันต่อไป แต่ฉันรู้สึกว่าอาจเปลี่ยนไปใช้สวิตช์ที่ Matej แนะนำ - person Gabriel Ortega; 14.04.2012