Does your incoming data really look like this without the opening curly braces?
Also if you parser.addString() you should make sure the original string is empty since when you already have a string stored that contains invalid data and add (aka append) to that you'll always ever see the old data and never parse the newly added.
See more elaborate discussion here
Try reading out the JSON buffer via Serial.println(parser.getBuffer());
BTW, you are violating the 1/sec rate limit for Particle.publish() when the condition is satisfied.
NOTE 2: Particle.publish() and the Particle.subscribe()handler(s) share the same buffer. As such, calling Particle.publish() within a Particle.subscribe() handler will wipe the subscribe buffer! In these cases, copying the subscribe buffer's content to a separate char buffer prior to calling Particle.publish() is recommended. https://docs.particle.io/reference/device-os/firmware/photon/#particle-subscribe-
When you Particle.publish from a subscribe handler you overwrite the contents of the received data, which is why you can't read the latitude, etc. successfully.
You also need to parser.clear() as ScruffR pointed out.
And you can probably make it work by swapping the first two lines, calling addString() first.