GeoLocationAnchorand MKTileOverlay@TachibanaKaoru2022/6/22 #potatotips 78
View Slide
About Me@TachibanaKaoruFreelance iOS Engineer
What's new ARKit 64K Video ModeRoomPlanLocation Anchor
RoomPlanެࣜαϯϓϧίʔυ͋Γ
GeoLocation (AR Anchor)Introduced 2020 (ARKit 4)ൃදॳ͑ͨॴ αϯϑϥϯγείɺγΧΰɺϚΠΞϛɺχϡʔϤʔΫɺϩαϯθϧεͷΈɻରҬΛ૿͢༧ఆͱ͍͍ͳ͕ΒɺʢCovid19ͷӨڹ͋Γʣͳ͔ͳ͔૿͑·ͤΜͰͨ͠ɻ
AR Anchor Available PlaceWWDC 2022Ͱɺେ෯ʹରҬΛ֦େ͠ɺͬͱຊʹରԠҬ͕͖·ͨ͠ɻԬɺౡɺେࡕɺژɺ໊ݹɺԣɺ౦ژ
AR AnchorͱҐஔʢҢ/ܦʣΛࢦఆͯ͠ΞϯΧʔΛ͓͘͜ͱ͕Ͱ͖Δ࣮ࡍͷݐͷ3DใͱɺΧϝϥը૾͔Βੳͨ͠3DใͱɺͷGPSใΛΈ߹ΘͤͨΈඇৗʹਖ਼֬ͳҐஔଌఆ͕ՄೳARҐஔܥήʔϜɺಓҊͳͲ͕؆୯ʹ࣮Մೳ
GeoLocation : check availabilityvar targetLocation = CLLocationCoordinate2D()targetLocation.latitude = lattargetLocation.longitude = longARGeoTrackingConfiguration.checkAvailability(at: targetLocation,completionHandler: { (available, error) in// check available})
GeoLocation : check availabilityavailable ͕ trueͷ߹ʹ༻Մೳɻavailable ͕ falseͷ߹ʹ༻ෆՄೳ͕ͩɺΤϥʔίʔυͰཧ༝Λ֬ೝ͢Δ͜ͱError Code = 201 "Geo tracking is not available at this location."Error Code = 501 "Request failed." ʢϦΫΤετස͕ߴ͍ͱൃੜʣ
zoom 10ௐࠪ : 2022/6/22ௐࠪϙΠϯτɿ֤άϦουͷதԝLatitude : 34.710809-37.050435Longitude: 137.726092-140.887614
zoom 11ௐࠪ : 2022/6/22ௐࠪϙΠϯτɿ֤άϦουͷதԝLatitude : 34.710809-37.050435Longitude: 137.726092-140.887614
zoom 12ௐࠪ : 2022/6/22ௐࠪϙΠϯτɿ֤άϦουͷதԝLatitude : 34.710809-37.050435Longitude: 137.726092-140.887614
Available Place in Kanto Areaͬ͘͟Γݍԝಓɾࠃಓ468ͷଆͷࢢ֗https://ja.wikipedia.org/wiki/टݍதԝ࿈བྷࣗಈंಓ
MKTileOverlay~iOS 7.0MKMapViewʹใΛΦʔόʔϨΠͰදࣔ͢Δ͜ͱ͕Ͱ͖Δɻ
MKTileOverlayTileʹରԠͨ͠ใGoogle MapࠃཧӃͳͲ͔Βఏڙ͞Ε͍ͯΔɻMKTileOverlayʹɺTileରԠͨ͠API pathΛ͚ͩ͢ͰλΠϧΛදࣔ͢Δ͜ͱՄೳྫɿࠃཧӃʢ୶৭ਤʣhttps://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png
λΠϧͱʁਤΛ zoom level ʹԠׂͯ͡͠ɺͦΕΛඞཁʹԠͯ͡৴ɾར༻͢Δɻzoom level 0 -> 1 tilezoom level 1 -> 4 tileszoom level 2 -> 16 tiles...zoom level 10 -> 1048576 tileszoom level n -> (2^n)^2
Tile Positionٿ্ͷಛఆͷ࠲ඪ͕ɺͲͷλΠϧʹҐஔ͢Δͷ͔longitude = 135.0latitude = 35.0
Longitude to xܦͰTileͷx͕ܾ·Δzoom level 2 -> 16 tileslongitude = 135.0ܦ0Λج४ͱ͠ɺٿ໘Λ8ׂ͢Δ 0long = 01 234567long = 135͔ΒΈͨٿ
Latitude to yҢͰTileͷy͕ܾ·Δzoom level 2 -> 16 tileslatitude = 35.0ۃΛج४ͱ͠ɺٿ໘Λ8ׂ͢Δ51234067lat = 35ԣ͔ΒΈͨٿ
let res = initialResolution / pow(2,zoom)let originShift = 2 * Double.pi * 6378137 / 2.0var my = log( tan((90 + lat) * Double.pi / 360.0 )) / (Double.pi / 180.0)let py = (my + self.originShift) / reslet tms_y = Int( ceil( py / Double(self.tileSize) ) - 1 )let google_y = Int(pow(2, zoom) - 1 ) - tms_yignorey = Rln(tan(π4+ϕ2))85.1°
ReferenceࠃཧӃɹཧӃλΠϧʹ͍ͭͯhttps://maps.gsi.go.jp/development/siyou.htmlਤӨ๏ֶशͷͨΊͷਤը૾ૉࡐूhttps://user.numazu-ct.ac.jp/~tsato/tsato/graphics/map_projection/άʔάϧϚοϓͷλΠϧhttps://maptiler.jp/google-maps-coordinates-tile-bounds-projection/