omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    How to get latitude and longitude from a CLLocationCoordinate2D

    Pythonista
    core location
    2
    5
    2559
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • ekson
      ekson last edited by ccc

      Sorry for my poor English!
      I wrote a script on Pythonista to get my current coordinate within CLLoctionManagerDelegate’s method.
      The coordinate of type CllocationCorrdinate2D is a structure.I don’t know how to get the latitude and latitude.Have Someone ever do that before?Thx for you reply!
      The following code is what I did right now,and it doesn’t get the right result:

      from objc_util import *
      from location import *
      
      class CLLocationCoordinate2D (Structure):
      	_fields_ = [('latitude', c_double), ('longitude', c_double)]
      
      def locationManager_didUpdateHeading_(_self,_cmd,manager,newheading):
      	heading=newheading
      	#print(heading)
      	
      def locationManager_didUpdateLocations_(_self,_cmd,manager,locations):
      	locations=ObjCInstance(locations)
      	
      	print(locations[0].coordinate().latitude)
      	manager=ObjCInstance(manager)
      	manager.stopUpdatingLocation()
      	
      	
      
      methods=[locationManager_didUpdateHeading_,locationManager_didUpdateLocations_]
      protocols=['CLLocationManagerDelegate']
      LMD=create_objc_class('Delegate',NSObject,methods=methods,protocols=protocols)
      
      CLLocationManager=ObjCClass('CLLocationManager')
      locationManager=CLLocationManager.alloc().init()
      delegate=LMD.alloc().init()
      locationManager.setDelegate(delegate)
      #locationManager.startUpdatingHeading()
      locationManager.startUpdatingLocation()
      
      coor=CLLocationCoordinate2D(30.1,104)
      #print(coor.latitude)
      1 Reply Last reply Reply Quote 1
      • JonB
        JonB last edited by

        @ekson said:

        CLLocationManager

        What are you getting? All 0's?

        It seems from your code that you get a single location, then stop updating. You might want to let the manager run a few cycles -- and/or use the last entry in locations (locations[-1]) rather than the first (last is most recent). I know in the location module, sometimes it takes one or two samples to get valid entries.

        Also, per Apple, you might need to

        Configure the properties related to the service you intend to use. For example, when getting location updates, always configure the distanceFilter and desiredAccuracy properties.

        See CLLLocationManager docs.

        Of course, if you just want locations, I assume you know you can use the pythonista location module which does this all for you (but perhaps without the same level of control)

        1 Reply Last reply Reply Quote 0
        • ekson
          ekson last edited by

          Thx for your reply.I think I’ve configured the CLLocationManager and it’s delegate rightly to get the location.But I don’t know how to get CLLocationCoordinate2D’s latitude and longitude.(I mean I don’t know how to get a property from a structure).That makes me have a bee my head.

          I use the Location of Pythonista to get the location,But I still want to know how use the native core location to do the same work.

          1 Reply Last reply Reply Quote 0
          • JonB
            JonB last edited by

            its helpful to mention if you get an error, and paste the traceback. In this case: AttributeError: '__Structure' object has no attribute 'latitude' would have led in the right direction.

            Long story short, objc_util doesnt always know how to name the structure fields that are return types -- in this case, it only knows it is a structure with two doubles, so names them a and b.

            locations[0].coordinate().a
            locations[0].coordinate().b

            You can specify the return type and argtype, or, you could cast the returned anonymous structure as the one you want.

            coordinates=locations[0].coordinate(restype=CLLocationCoordinate2D, argtypes=[])
            print(coordinates.latitude, coordinates.longitude)
            
            1 Reply Last reply Reply Quote 2
            • ekson
              ekson last edited by

              Thanks a lot!That’s great!

              1 Reply Last reply Reply Quote 0
              • First post
                Last post
              Powered by NodeBB Forums | Contributors