国土地理院のREST API「標高API」を呼んで、現在位置の標高を取得するAppleScriptです。


— 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"

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
    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()
    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


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}
    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
    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: "
    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

★Click Here to Open This Script 

Please follow and like us:


メールアドレスが公開されることはありません。 * が付いている欄は必須項目です