国土地理院のREST API「標高API」を呼んで、現在位置の標高を取得するAppleScriptです。
現在位置の取得のためにMac本体のWiFiがオンになっている必要があります。
AppleScript名:(GET)国土地理院APIで現在位置の標高を取得する |
— Created 2016-10-29 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "CoreLocation" use framework "CoreWLAN" –http://maps.gsi.go.jp/development/api.html property locationManager : missing value property curLatitude : 0 property curLongitude : 0 set reqURLStr to "http://cyberjapandata2.gsi.go.jp/general/dem/scripts/getelevation.php" –現在地の緯度、経度情報を取得する set {aLat, aLong} to getCurrentLocation() of me set aRec to {lon:aLong as string, lat:aLat as string, outtype:"JSON"} set aURL to retURLwithParams(reqURLStr, aRec) of me set aRes to callRestGETAPIAndParseResults(aURL) of me set aRESTres to (json of aRes) as record return aRESTres –> {hsrc:"5m(レーザ)", elevation:40.4} –set aRESCode to responseCode of aRes –> 200 –set aRESHeader to responseHeader of aRes –> {Server:"Apache/2.4.10 (Debian) PHP/5.6.19", Content-Type:"application/json; charset=utf-8", X-Powered-By:"PHP/5.6.19", Connection:"Keep-Alive", Access-Control-Allow-Origin:"*", Date:"Sat, 29 Oct 2016 10:53:14 GMT", Content-Encoding:"gzip", Content-Length:"71", Keep-Alive:"timeout=5, max=100", Vary:"Accept-Encoding"} –GET methodのREST APIを呼ぶ on callRestGETAPIAndParseResults(aURL) set aRequest to current application’s NSMutableURLRequest’s requestWithURL:(current application’s |NSURL|’s URLWithString:aURL) aRequest’s setHTTPMethod:"GET" aRequest’s setCachePolicy:(current application’s NSURLRequestReloadIgnoringLocalCacheData) aRequest’s setHTTPShouldHandleCookies:false aRequest’s setTimeoutInterval:60 aRequest’s setValue:"application/json" forHTTPHeaderField:"Accept" set aRes to current application’s NSURLConnection’s sendSynchronousRequest:aRequest returningResponse:(reference) |error|:(missing value) set resList to aRes as list set bRes to contents of (first item of resList) set resStr to current application’s NSString’s alloc()’s initWithData:bRes encoding:(current application’s NSUTF8StringEncoding) set jsonString to current application’s NSString’s stringWithString:resStr set jsonData to jsonString’s dataUsingEncoding:(current application’s NSUTF8StringEncoding) set aJsonDict to current application’s NSJSONSerialization’s JSONObjectWithData:jsonData options:0 |error|:(missing value) –Get Response Code & Header set dRes to contents of second item of resList if dRes is not equal to missing value then set resCode to (dRes’s statusCode()) as number set resHeaders to (dRes’s allHeaderFields()) as record else set resCode to 0 set resHeaders to {} end if return {json:aJsonDict, responseCode:resCode, responseHeader:resHeaders} end callRestGETAPIAndParseResults on retURLwithParams(aBaseURL, aRec) set aDic to current application’s NSMutableDictionary’s dictionaryWithDictionary:aRec set aKeyList to (aDic’s allKeys()) as list set aValList to (aDic’s allValues()) as list set aLen to length of aKeyList set qList to {} repeat with i from 1 to aLen set aName to contents of item i of aKeyList set aVal to contents of item i of aValList set the end of qList to (current application’s NSURLQueryItem’s queryItemWithName:aName value:aVal) end repeat set aComp to current application’s NSURLComponents’s alloc()’s initWithString:aBaseURL aComp’s setQueryItems:qList set aURL to (aComp’s |URL|()’s absoluteString()) as text return aURL end retURLwithParams on urlencodeStr(aStr) set aString to current application’s NSString’s stringWithString:aStr set aString to (aString’s stringByAddingPercentEncodingWithAllowedCharacters:(current application’s NSCharacterSet’s URLQueryAllowedCharacterSet())) as text return aString end urlencodeStr on getCurrentLocation() activeWiFiPower() of me set locationManager to current application’s CLLocationManager’s alloc()’s init() set locE to locationManager’s locationServicesEnabled() if (locE as boolean) = true then locationManager’s setDelegate:me locationManager’s setDesiredAccuracy:(current application’s kCLLocationAccuracyNearestTenMeters) locationManager’s setDistanceFilter:500 locationManager’s startUpdatingLocation() else return false –error in init end if set hitF to false repeat 3000 times if {curLatitude, curLongitude} is not equal to {0, 0} then set hitF to true exit repeat end if delay 0.01 end repeat if hitF = false then return false return {curLatitude, curLongitude} end getCurrentLocation —-以下、curLocationLibの内容 on locationManager:manager didUpdateLocations:locations –Listing 1-3 Processing an incoming location event set location to (locations’s lastObject()) set eventDate to (location’s timestamp()) set howRecent to (eventDate’s timeIntervalSinceNow()) –Calc ABS set howRecent to howRecent as real set howRecent to absNum(howRecent) log howRecent if howRecent < 15.0 then set alt to location’s altitude –> (NSNumber) 46.356517791748 set aSpeed to location’s speed –> (NSNumber) -1.0 set aCourse to location’s course –North:0, East:90, South:180, West:270 –> (NSNumber) -1.0 –By Shane Stanley set theDescription to location’s |description|() –> (NSString) "<+35.xxxxx,+139.xxxxxx> +/- 65.00m (speed -1.00 mps / course -1.00) @ 2015/03/04 8時56分41秒 日本標準時" set anNSScanner to current application’s NSScanner’s scannerWithString:theDescription anNSScanner’s setCharactersToBeSkipped:(current application’s NSCharacterSet’s characterSetWithCharactersInString:"<,") set {theResult, aLat} to anNSScanner’s scanDouble:(reference) set {theResult, aLng} to anNSScanner’s scanDouble:(reference) copy {aLat, aLng} to {my curLatitude, my curLongitude} else log {"stopUpdatingLocation"} locationManager’s stopUpdatingLocation() end if end locationManager:didUpdateLocations: on locationManager:anCLLocationManager didFailWithError:anNSError display dialog (anNSError’s localizedDescription() as text) end locationManager:didFailWithError: on absNum(aNum) if aNum > 0 then return aNum else return (aNum * -1) end if end absNum —Activate WiFi Power on activeWiFiPower() set dName to getWiFiDeviceName() of me set aInterface to current application’s CWInterface’s alloc()’s initWithInterfaceName:dName set aPowerStat to (aInterface’s powerOn()) as boolean if aPowerStat = false then set wRes to aInterface’s setPower:true |error|:(missing value) if wRes = missing value then error "Can’t power on WiFi Interface." end if end if end activeWiFiPower –指定ハードウェアポートのデバイス名を取得する on getWiFiDeviceName() set v2 to system attribute "sys2" –> 4 if v2 ≤ 6 then set hardWareName to "AirPort" –Under Mac OS X 10.6.8 set aMesStr to "Current AirPort Network: " else if v2 ≥ 7 then set hardWareName to "Wi-Fi" –Mac OS X 10.7 or later set aMesStr to "Current Wi-Fi Network: " else display dialog "error" end if set dName to getHardwareDeviceName(hardWareName) of me return dName end getWiFiDeviceName –指定ハードウェアポートのデバイス名を取得する on getHardwareDeviceName(targName) set sRes to do shell script "/usr/sbin/networksetup -listallhardwareports" log sRes set sList to paragraphs of sRes set s1List to items 2 thru -1 of sList set s2List to {} repeat with i in s1List set j to contents of i if j is equal to "VLAN Configurations" then exit repeat end if set the end of s2List to j end repeat –ネットワークポート関連のレコードを作成 set s3List to {} set aLen to length of s2List repeat with i from 1 to aLen by 4 set a1Item to contents of item i of s2List set a1Item to repChar(a1Item, "Hardware Port: ", "") of me set a2Item to contents of item (i + 1) of s2List set a2Item to repChar(a2Item, "Device: ", "") of me set a3Item to contents of item (i + 2) of s2List set a3Item to repChar(a3Item, "Ethernet Address: ", "") of me set the end of s3List to {hardwarePort:a1Item, device:a2Item, ethernetAddress:a3Item} end repeat repeat with i in s3List set j1 to hardwarePort of i set j2 to device of i if j1 is equal to targName then return j2 end if end repeat return "" end getHardwareDeviceName –文字置換ルーチン on repChar(origText, targStr, repStr) set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr} set temp to text items of origText set AppleScript’s text item delimiters to repStr set res to temp as text set AppleScript’s text item delimiters to txdl return res end repChar |
More from my site
(Visited 88 times, 1 visits today)