หมุดตำแหน่งทางภูมิศาสตร์เป็นหมุดประเภทหนึ่งที่ให้คุณวางเนื้อหา 3 มิติในโลกแห่งความเป็นจริงได้
ประเภทของหมุดยึดเชิงพื้นที่
หมุดยึดเชิงพื้นที่มี 3 ประเภท ซึ่งแต่ละประเภทจัดการระดับความสูงแตกต่างกันไป ดังนี้
หมุด WGS84:
หมุด WGS84 ช่วยให้คุณวางเนื้อหา 3 มิติที่ละติจูด ลองจิจูด และระดับความสูงที่ต้องการได้หมุดเทอร์เรน:
หมุดเทอร์เรนช่วยให้คุณวางเนื้อหาได้โดยใช้เฉพาะละติจูดและลองจิจูดที่มีความสูงสัมพันธ์กับภูมิประเทศ ณ ตำแหน่งนั้น ระดับความสูงจะกำหนดตามพื้นดินหรือพื้นตามที่ VPS ทราบจุดยึดบนชั้นดาดฟ้า:
จุดยึดบนชั้นดาดฟ้าช่วยให้คุณวางเนื้อหาได้โดยใช้เฉพาะละติจูดและลองจิจูดที่มีความสูงสัมพันธ์กับชั้นดาดฟ้าของอาคาร ณ ตําแหน่งนั้น ระดับความสูงจะถูกกำหนดแบบสัมพัทธ์กับยอดของอาคารตามที่ทราบจาก Streetscape Geometry ซึ่งจะมีค่าเริ่มต้นเป็นระดับความสูงของภูมิประเทศเมื่อไม่ได้วางไว้บนอาคาร
WGS84 | ภูมิประเทศ | ดาดฟ้า | |
---|---|---|---|
ตำแหน่งแนวนอน | ละติจูด ลองจิจูด | ละติจูด ลองจิจูด | ละติจูด ลองจิจูด |
ตำแหน่งแนวตั้ง | สัมพัทธ์กับความสูง WGS84 | สัมพันธ์กับระดับภูมิประเทศที่กำหนดโดย Google Maps | สัมพันธ์กับระดับดาดฟ้าที่ Google Maps ระบุ |
ต้องแก้ไขจากเซิร์ฟเวอร์ไหม | ไม่ | ได้ | ใช่ |
ข้อกำหนดเบื้องต้น
โปรดตรวจสอบว่าคุณได้เปิดใช้ Geospatial API แล้วก่อนดำเนินการต่อ
วางจุดยึดภูมิสารสนเทศ
หมุดแต่ละประเภทมี API เฉพาะสำหรับสร้าง โปรดดูข้อมูลเพิ่มเติมที่ประเภทของหมุดพิกัดภูมิศาสตร์
สร้างจุดยึดจากการทดสอบการคลิก
นอกจากนี้ คุณยังสร้างหมุดตำแหน่งทางภูมิศาสตร์จากผลการทดสอบ Hit Test ได้ด้วย
ใช้การเปลี่ยนรูปแบบจาก Hit-Test และแปลงเป็น GARGeospatialTransform
ให้ใช้ตำแหน่งเพื่อวาง Anchor ประเภทใดประเภทหนึ่งจาก 3 ประเภทที่อธิบายไว้
รับการเปลี่ยนรูปแบบเชิงพื้นที่จากการเปลี่ยนรูปแบบ AR
GARSession.geospatialTransformFromTransform:error:
มีวิธีเพิ่มเติมในการระบุละติจูดและลองจิจูดโดยการแปลง AR Transform เป็นการแปลงภูมิสารสนเทศ
รับการเปลี่ยนรูปแบบ AR จากการเปลี่ยนรูปแบบเชิงพื้นที่
GARSession.transformFromGeospatialCoordinate:altitude:eastUpSouthQTarget:error:
จะแปลงตำแหน่งแนวนอน ระดับความสูง และการหมุนควอร์เทอร์ไบน์ที่ระบุโดยโลกตามกรอบพิกัดตะวันออก-ขึ้น-ใต้เป็นการแปลง AR ตามพิกัดโลก GL
เลือกวิธีการที่เหมาะกับกรณีการใช้งานของคุณ
วิธีการสร้าง Anchor แต่ละวิธีมีข้อดีข้อเสียที่เกี่ยวข้องที่ควรคำนึงถึง ดังนี้
- เมื่อใช้ Streetscape Geometry ให้ใช้การทดสอบ Hit เพื่อแนบเนื้อหากับอาคาร
- แนะนำให้ใช้จุดยึดบนพื้นดินหรือบนหลังคาแทนจุดยึด WGS84 เนื่องจากใช้ค่าระดับความสูงที่ Google Maps กำหนด
ระบุละติจูดและลองจิจูดของสถานที่
คุณสามารถคํานวณละติจูดและลองจิจูดของสถานที่ได้ 3 วิธีดังนี้
- ใช้ Geospatial Creator เพื่อดูและเพิ่มประสิทธิภาพโลกด้วยเนื้อหา 3 มิติโดยไม่ต้องไปที่สถานที่จริง ซึ่งช่วยให้คุณวางเนื้อหา 3 มิติที่สมจริงได้โดยใช้ภาพจาก Google Maps ใน Unity Editor ระบบจะคำนวณละติจูด ลองจิจูด การหมุน และระดับความสูงของเนื้อหาให้คุณโดยอัตโนมัติ
- ใช้ Google Maps
- ใช้ Google Earth โปรดทราบว่าการหาพิกัดเหล่านี้โดยใช้ Google Earth แทน Google Maps จะมีความคลาดเคลื่อนได้สูงสุดหลายเมตร
- ไปที่สถานที่ตั้งจริง
ใช้ Google Maps
วิธีรับละติจูดและลองจิจูดของสถานที่โดยใช้ Google Maps
ไปที่ Google Maps ในคอมพิวเตอร์เดสก์ท็อป
ไปที่เลเยอร์ > เพิ่มเติม
เปลี่ยนประเภทแผนที่เป็นดาวเทียม แล้วยกเลิกการเลือกช่องทำเครื่องหมายมุมมองโลกที่มุมซ้ายล่างของหน้าจอ
ซึ่งจะบังคับใช้มุมมอง 2 มิติและขจัดข้อผิดพลาดที่อาจเกิดขึ้นจากมุมมอง 3 มิติที่เอียง
บนแผนที่ ให้คลิกขวาที่ตำแหน่งและเลือกลองจิจูด/ละติจูดเพื่อคัดลอกไปยังคลิปบอร์ด
ใช้ Google Earth
คุณสามารถคํานวณละติจูดและลองจิจูดของสถานที่จาก Google Earth ได้โดยคลิกสถานที่ใน UI และอ่านข้อมูลจากรายละเอียดจุดสังเกต
หากต้องการทราบละติจูดและลองจิจูดของสถานที่โดยใช้ Google Earth ให้ทำดังนี้
ไปที่ Google Earth ในคอมพิวเตอร์เดสก์ท็อป
ไปที่เมนูแฮมเบอร์เกอร์ แล้วเลือกรูปแบบแผนที่
ปิดสวิตช์สิ่งปลูกสร้าง 3 มิติ
เมื่อปิดสวิตช์อาคาร 3 มิติแล้ว ให้คลิกไอคอนหมุด เพื่อเพิ่มหมุดหมาย ณ ตำแหน่งที่เลือก
ระบุโปรเจ็กต์ที่จะใส่หมุด แล้วคลิกบันทึก
ป้อนชื่อหมุดในช่องชื่อของหมุด
คลิกลูกศรย้อนกลับ ในแผงโปรเจ็กต์ แล้วเลือกเมนู การดำเนินการเพิ่มเติม
เลือกส่งออกเป็นไฟล์ KML จากเมนู
ไฟล์ KLM จะรายงานละติจูด ลองจิจูด และระดับความสูงของจุดสังเกตในแท็ก <coordinates>
โดยคั่นด้วยคอมมา ดังนี้
<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>
อย่าใช้ละติจูดและลองจิจูดจากแท็ก <LookAt>
ซึ่งระบุตำแหน่งกล้อง ไม่ใช่ตำแหน่ง
ไปที่สถานที่ตั้งจริง
คุณสามารถคำนวณระดับความสูงของสถานที่ได้โดยไปที่สถานที่นั้นและทำการสังเกตการณ์ในพื้นที่
รับควอร์เทอร์ไบน์การหมุน
GARGeospatialTransform.eastUpSouthQTarget
ดึงข้อมูลการวางแนวจากการเปลี่ยนรูปแบบเชิงพื้นที่และแสดงผลควอร์เทอร์ไบน์ที่แสดงถึงเมทริกซ์การหมุนที่เปลี่ยนเวกเตอร์จากเป้าหมายไปยังระบบพิกัดตะวันออก-ขึ้น-ใต้ (EUS) X+ จะชี้ไปทางตะวันออก Y+ จะชี้ขึ้น และ Z+ จะชี้ไปทางใต้ โดยระบบจะเขียนค่าตามลำดับ {x, y, z, w}
จุดยึด WGS84
หมุด WGS84 คือหมุดประเภทหนึ่งที่ให้คุณวางเนื้อหา 3 มิติที่ละติจูด ลองจิจูด และระดับความสูงใดก็ได้ โดยอาศัยการเปลี่ยนรูปแบบและการวางแนวเพื่อวางตำแหน่งในโลกแห่งความเป็นจริง ตำแหน่งประกอบด้วยละติจูด ลองจิจูด และระดับความสูง ซึ่งระบุไว้ในระบบพิกัด WGS84 การวางแนวประกอบด้วยการหมุนควอร์เทอร์ไบน์
ระบบจะรายงานระดับความสูงเป็นเมตรเหนือระนาบวงรีอ้างอิง WGS84 เพื่อให้ระดับพื้นดินไม่ใช่ 0 แอปของคุณมีหน้าที่รับผิดชอบในการจัดหาพิกัดเหล่านี้สำหรับจุดยึดแต่ละจุดที่สร้าง
วางหมุด WGS84 ในโลกแห่งความเป็นจริง
ระบุระดับความสูงของสถานที่
การกำหนดระดับความสูงของสถานที่เพื่อวางจุดยึดทำได้หลายวิธี ดังนี้
- หากตำแหน่งของจุดยึดอยู่ใกล้กับผู้ใช้จริงๆ คุณสามารถใช้ระดับความสูงที่ใกล้เคียงกับระดับความสูงของอุปกรณ์ของผู้ใช้ได้
- เมื่อทราบละติจูดและลองจิจูดแล้ว ให้ใช้ Elevation API เพื่อรับระดับความสูงตามข้อกำหนด EGM96 คุณต้องแปลงระดับความสูง EGM96 ของ Maps API เป็น WGS84 เพื่อเปรียบเทียบกับระดับความสูง
GARGeospatialTransform
ดู GeoidEval ที่มีทั้งบรรทัดคำสั่งและอินเทอร์เฟซ HTML Maps API จะรายงานละติจูดและลองจิจูดตามข้อกำหนด WGS84 โดยค่าเริ่มต้น - คุณดูละติจูด ลองจิจูด และระดับความสูงของตำแหน่งได้จาก Google Earth ซึ่งจะทำให้คุณมีความคลาดเคลื่อนได้สูงสุดหลายเมตร ใช้ละติจูด ลองจิจูด และระดับความสูงจากแท็ก
<coordinates>
ไม่ใช่แท็ก<LookAt>
ในไฟล์ KML - หากมีจุดยึดที่มีอยู่ใกล้ๆ และคุณไม่ได้อยู่บนทางลาดชันชันชันชัน คุณอาจใช้ระดับความสูงจาก
GARGeospatialTransform
ของกล้องได้โดยไม่ต้องใช้แหล่งข้อมูลอื่น เช่น Maps API
สร้าง Anchor
เมื่อคุณมีละติจูด ลองจิจูด ความสูง และควอร์เทอร์ไบน์ของการหมุนแล้ว ให้ใช้ createAnchorWithCoordinate:altitude:eastUpSouthQAnchor:error:
เพื่อกำหนดตำแหน่งเนื้อหาตามพิกัดทางภูมิศาสตร์ที่คุณระบุ
NSError *error = nil;
GARAnchor *anchor = [self.garSession createAnchorWithCoordinate:coordinate
altitude:altitude
eastUpSouthQAnchor:eastUpSouthQAnchor
error:&error];
ตัวยึดภูมิประเทศ
จุดยึดตามภูมิประเทศเป็นจุดยึดประเภทหนึ่งที่ให้คุณวางวัตถุ AR ได้โดยใช้เฉพาะละติจูดและลองจิจูด โดยใช้ประโยชน์จากข้อมูลจาก VPS เพื่อค้นหาระดับความสูงจากพื้นดินที่แม่นยำ
คุณต้องระบุระดับความสูงเหนือภูมิประเทศแทนการป้อนระดับความสูงที่ต้องการ เมื่อค่านี้เป็น 0 หมุดยึดจะอยู่ในระดับเดียวกับภูมิประเทศ
ตั้งค่าโหมดหาเครื่องบิน
เครื่องมือค้นหาเครื่องบินเป็นตัวเลือกที่ไม่บังคับและไม่จำเป็นต้องใช้หมุดยึด โปรดทราบว่าระบบจะใช้เฉพาะระนาบแนวนอน ระนาบแนวนอนจะช่วยจัดแนวหมุดยึดภูมิประเทศบนพื้นดินแบบไดนามิก
ใช้ ARWorldTrackingConfiguration.PlaneDetection
เพื่อเลือกวิธีที่แอปจะตรวจจับเครื่องบิน
สร้างหมุดเทอร์เรนโดยใช้ Async API ใหม่
หากต้องการสร้างและวางจุดยึดภูมิประเทศ ให้กด GARSession.createAnchorWithCoordinate:altitudeAboveTerrain:eastUpSouthQAnchor:completionHandler:error:
หมุดจะไม่พร้อมใช้งานในทันทีและจำเป็นต้องแก้ไข เมื่อแก้ไขแล้ว รายการดังกล่าวจะพร้อมใช้งานใน GARCreateAnchorOnTerrainFuture
GARCreateAnchorOnTerrainFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
altitudeAboveTerrain:altitude
eastUpSouthQAnchor:eastUpSouthQTarget
completionHandler:^(GARAnchor *anchor, GARTerrainAnchorState state) {
// handle completion
}
error:&error];
ดู "สถานะของอนาคต"
อนาคตจะมี GARFutureState
ที่เชื่อมโยงอยู่
รัฐ | คำอธิบาย |
---|---|
GARFutureStatePending |
การดำเนินการยังอยู่ระหว่างรอดำเนินการ |
GARFutureStateDone |
การดำเนินการเสร็จสมบูรณ์และผลลัพธ์พร้อมใช้งาน |
GARFutureStateCancelled |
การดำเนินการถูกยกเลิกแล้ว |
ตรวจสอบสถานะการยึดตามภูมิประเทศของผลลัพธ์ในอนาคต
GARTerrainAnchorState
เป็นของการดำเนินการแบบไม่พร้อมกันและเป็นส่วนหนึ่งของผลลัพธ์ในอนาคตสุดท้าย
switch (future.resultTerrainAnchorState) {
case GARTerrainAnchorStateSuccess:
// Terrain anchor finished resolving.
break;
case GARTerrainAnchorStateErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case GARTerrainAnchorStateErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/ios/group/GARTerrainAnchorState#garterrainanchorstateerrornotauthorized
// for troubleshooting steps.
break;
case GARTerrainAnchorStateErrorInternal:
// The Terrain anchor could not be resolved due to an internal error.
break;
default:
break;
}
หมุดยึดบนหลังคา
ตัวยึดบนหลังคาเป็นตัวยึดประเภทหนึ่งและคล้ายกับตัวยึดภูมิประเทศด้านบนมาก ความแตกต่างคือ คุณจะระบุระดับความสูงเหนือชั้นดาดฟ้า แทนที่จะเป็นระดับความสูงเหนือภูมิประเทศ
สร้าง Anchor บน Rooftop โดยใช้ Async API ใหม่
หมุดจะไม่พร้อมใช้งานในทันทีและจำเป็นต้องแก้ไข
หากต้องการสร้างและวางหมุดยึดบนหลังคา ให้โทรหา GARSession.createAnchorWithCoordinate:altitudeAboveRooftop:eastUpSouthQAnchor:completionHandler:error:
คุณจะเข้าถึง GARFutureState
ของอนาคตได้ด้วย ซึ่งคล้ายกับจุดยึดของภูมิประเทศ จากนั้นคุณตรวจสอบผลลัพธ์ในอนาคตเพื่อเข้าถึง GARRooftopAnchorState
ได้
GARCreateAnchorOnRooftopFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
altitudeAboveRooftop:altitude
eastUpSouthQAnchor:eastUpSouthQTarget
completionHandler:^(GARAnchor *anchor, GARRooftopAnchorState state) {
// handle completion
}
error:&error];
ดู "สถานะของอนาคต"
ส่วน "อนาคต" จะมี GARFutureState
ที่เกี่ยวข้อง โปรดดูตารางด้านบน
ตรวจสอบสถานะ Anchor บนหลังคาของผลลัพธ์ในอนาคต
GARRooftopAnchorState
เป็นของการดำเนินการแบบไม่พร้อมกันและเป็นส่วนหนึ่งของผลลัพธ์ Future สุดท้าย
switch (future.resultRooftopAnchorState) {
case GARRooftopAnchorStateSuccess:
// Rooftop anchor finished resolving.
break;
case GARRooftopAnchorStateErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case GARRooftopAnchorStateErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/ios/group/GARRooftopAnchorState#garrooftopanchorstateerrornotauthorized
// for troubleshooting steps.
break;
case GARRooftopAnchorStateErrorInternal:
// The Rooftop anchor could not be resolved due to an internal error.
break;
default:
break;
}
ขั้นตอนถัดไป
- โปรดตรวจสอบว่าคุณเข้าใจโควต้าการใช้งาน API ของภูมิสารสนเทศ