UnownHash / Golbat

The Unlicense
36 stars 19 forks source link

Route support #129

Closed Mygod closed 1 year ago

Mygod commented 1 year ago

Looks like everything is in GetRoutesOutProto. Presumably needs another call.

Mygod commented 1 year ago

In honor of @jfberry's preference for JSON, I propose the following table with four many fields.

id string primary_key
start_lat float64
start_lon float64
end_lat float64
end_lon float64
cell_id uint64
name string
description string
waypoints json [{"pokestop_id": "id", "lat": 1.2, "lon": 3.4}, ...]
image string
reversible bool
submission_ms int64
distance_m int64
direction_deg float32
rating float32
type int8
duration_s int64
updated_ms int64

See updated here https://github.com/UnownHash/Golbat/issues/129#issuecomment-1650999743

Fabio1988 commented 1 year ago

I prefer routes in a different table... No need of json... Json is bad for querying

Mygod commented 1 year ago

This is a separate table of a mere four fields with one of them being a JSON field.

Fabio1988 commented 1 year ago

This is a separate table of a mere four fields with one of them being a JSON field.

Sorry misread then... Listing wayspots in json makes sense

ms should be seconds, to keep other formats, we should really not mix them .... We can discuss that at a different time

jfberry commented 1 year ago

I haven't got my head around the relationship between routes and pokestops/forts yet. But assuming it is an entirely new table that is just for this purpose we don't need to be concerned about adding fields that are making a table much wider than it needs to be (as opposed to showcases for example) fields for the fort would be named as per the foreign key (probably fort_id in this case though rather than gym_id/pokestop_id) name,description, image, should be in sql at least to be consistent with pokestop, gym, etc. Is there an image that is different from the fort image? waypoints would be in json or possibly a geographic field (eg linestring). Does the waypoints contain pokestops or just a list of lat/lon? my route has not been accepted yet so can't follow it. updated probably wants to be in a sql field as this will likely be used to detect changes

in fact, probably all relevant fields should probably just be sql aside from the wayspots (unless they are just a linestring)

Mygod commented 1 year ago

Sure we can make all of them into SQL fields. What is the number of columns do you consider the threshold for a table being too wide?

I haven't tested routes myself (thanks to not having map support sadge) but judging from people's gameplay video online, they do seem to have different images.

Waypoints are just a list of (fort_id, lat, lon). Hmm I am guessing fort_id might actually be empty and a lat lon might be provided instead?

jfberry commented 1 year ago

I wasn’t asked for an image when I submitted my route. In post processing it could have included forts I passed but I am yet to see a proto dump. We probably need that before going firm on this

trafficlight output anyone?

Mygod commented 1 year ago

Updated https://github.com/UnownHash/Golbat/issues/129#issuecomment-1646947660 with everything being SQL fields as suggested. Also not sure what's the point of the direction in degrees field. cell_id might also be useless to persist into table.

jfberry commented 1 year ago

I haven't yet seen how you discover start/end stops, whether it is just through this proto or if they are symbolised above stops eg through the GMO. It may make sense to have a marker on gym/pokestop to allow for fast display on map without having to join against this table. But need to see some real routes to form a view here. Secondly, and possibly related is how zygarde cells are indicated - are they consistent to stops on a route? or will a stop have them on all routes? are these incidents? (malte thinks they are something new, but again, have not seen proto dumps yet)

Mygod commented 1 year ago

Presumably Zygarde cells are also using the new RouteMapPokemon. Will have to see the 277 protos for that.

na-ji commented 1 year ago

Here's an example GetRoutesOutProto in JSON:

{
  "route_map_cell": [
    {
      "s2_cell_id": 5180860711974207488,
      "route": [
        {
          "id": "08e4af621d6140c785250187fe61f3ce.20",
          "waypoints": [
            {
              "lat_degrees": 48.86511993408203,
              "lng_degrees": 2.8160524368286133,
              "elevation_in_meters": 111.55239558964968
            },
            {
              "lat_degrees": 48.86538314819336,
              "lng_degrees": 2.8163275718688965,
              "elevation_in_meters": 110.32834683451802
            },
            {
              "lat_degrees": 48.86549377441406,
              "lng_degrees": 2.816417932510376,
              "elevation_in_meters": 110.38224436528981
            },
            {
              "lat_degrees": 48.86558532714844,
              "lng_degrees": 2.8165693283081055,
              "elevation_in_meters": 109.9576120544225
            },
            {
              "lat_degrees": 48.865623474121094,
              "lng_degrees": 2.8166911602020264,
              "elevation_in_meters": 109.49253232497722
            },
            {
              "lat_degrees": 48.865570068359375,
              "lng_degrees": 2.816889524459839,
              "elevation_in_meters": 108.35627800226212
            },
            {
              "lat_degrees": 48.865596771240234,
              "lng_degrees": 2.8171796798706055,
              "elevation_in_meters": 109.24617288541049
            },
            {
              "lat_degrees": 48.86595916748047,
              "lng_degrees": 2.817326307296753,
              "elevation_in_meters": 109.00339100603014
            },
            {
              "lat_degrees": 48.86616134643555,
              "lng_degrees": 2.817573070526123,
              "elevation_in_meters": 108.13980281446129
            },
            {
              "lat_degrees": 48.866729736328125,
              "lng_degrees": 2.8180816173553467,
              "elevation_in_meters": 106.08794871717691
            },
            {
              "lat_degrees": 48.86674880981445,
              "lng_degrees": 2.8181443214416504,
              "elevation_in_meters": 106.33416510000825
            },
            {
              "lat_degrees": 48.867042541503906,
              "lng_degrees": 2.818434476852417,
              "elevation_in_meters": 105.2609514510259
            },
            {
              "lat_degrees": 48.8671875,
              "lng_degrees": 2.818502426147461,
              "elevation_in_meters": 104.57100086193532
            },
            {
              "lat_degrees": 48.867431640625,
              "lng_degrees": 2.8185572624206543,
              "elevation_in_meters": 102.82595593389124
            },
            {
              "lat_degrees": 48.867576599121094,
              "lng_degrees": 2.8186113834381104,
              "elevation_in_meters": 102.18180227745324
            },
            {
              "lat_degrees": 48.8680305480957,
              "lng_degrees": 2.8190107345581055,
              "elevation_in_meters": 100.8843088336289
            },
            {
              "lat_degrees": 48.86821365356445,
              "lng_degrees": 2.8191113471984863,
              "elevation_in_meters": 100.25780984386802
            },
            {
              "lat_degrees": 48.86830520629883,
              "lng_degrees": 2.8192191123962402,
              "elevation_in_meters": 100.31473007425666
            },
            {
              "lat_degrees": 48.86840057373047,
              "lng_degrees": 2.8192596435546875,
              "elevation_in_meters": 100.55375846941024
            },
            {
              "lat_degrees": 48.86848449707031,
              "lng_degrees": 2.8191654682159424,
              "elevation_in_meters": 99.96367987431586
            },
            {
              "lat_degrees": 48.86865997314453,
              "lng_degrees": 2.819248676300049,
              "elevation_in_meters": 99.03239822387695
            },
            {
              "lat_degrees": 48.868934631347656,
              "lng_degrees": 2.818927526473999,
              "elevation_in_meters": 98.11900073055332
            },
            {
              "lat_degrees": 48.868896484375,
              "lng_degrees": 2.818908929824829,
              "elevation_in_meters": 97.92468819860369
            },
            {
              "lat_degrees": 48.86874008178711,
              "lng_degrees": 2.819068431854248,
              "elevation_in_meters": 98.22374468110502
            },
            {
              "lat_degrees": 48.868690490722656,
              "lng_degrees": 2.8192715644836426,
              "elevation_in_meters": 98.71666316874325
            },
            {
              "lat_degrees": 48.86899185180664,
              "lng_degrees": 2.819356679916382,
              "elevation_in_meters": 98.11650119069964
            },
            {
              "lat_degrees": 48.869266510009766,
              "lng_degrees": 2.819542407989502,
              "elevation_in_meters": 96.79824514593929
            },
            {
              "lat_degrees": 48.869407653808594,
              "lng_degrees": 2.8197803497314453,
              "elevation_in_meters": 96.09620608855039
            },
            {
              "lat_degrees": 48.86946487426758,
              "lng_degrees": 2.8198821544647217,
              "elevation_in_meters": 96.4562221840024
            },
            {
              "lat_degrees": 48.8694953918457,
              "lng_degrees": 2.81992244720459,
              "elevation_in_meters": 96.03644473385066
            },
            {
              "lat_degrees": 48.86955261230469,
              "lng_degrees": 2.8199872970581055,
              "elevation_in_meters": 95.62553024757653
            },
            {
              "lat_degrees": 48.86957931518555,
              "lng_degrees": 2.81998872756958,
              "elevation_in_meters": 95.72872674930841
            }
          ],
          "type": 1,
          "name": "Qtest",
          "version": 60,
          "description": "Morning",
          "creator_info": {},
          "reversible": true,
          "submission_time": 1688278478678,
          "route_distance_meters": 692,
          "route_duration_seconds": 960,
          "tags": ["route_tag_easy_going"],
          "aggregated_stats": {},
          "player_stats": {},
          "image": {
            "image_url": "http://lh3.googleusercontent.com/VVM-z0ASyfE8Rpzqq-HsbEyaQVbhajCpGomyg9Jb6PKMLv-xfd1b9wzwyMN4OrhShc9eshQd5Ti3ymrOwApFcxmPug",
            "border_color_hex": "9059FBFF"
          },
          "route_submission_status": {
            "status": 2,
            "submission_status_update_time_ms": 1688333087429
          },
          "start_poi": {
            "anchor": {
              "fort_id": "7835f8fcc0534d7bb581f23ca2ba39eb.16",
              "lat_degrees": 48.864983,
              "lng_degrees": 2.815926
            },
            "image_url": "http://lh3.googleusercontent.com/VVM-z0ASyfE8Rpzqq-HsbEyaQVbhajCpGomyg9Jb6PKMLv-xfd1b9wzwyMN4OrhShc9eshQd5Ti3ymrOwApFcxmPug"
          },
          "end_poi": {
            "anchor": {
              "fort_id": "dbb7d590b68e48d08df9ef9e807f768e.16",
              "lat_degrees": 48.86971,
              "lng_degrees": 2.820112
            },
            "image_url": "http://lh3.googleusercontent.com/PVPNb2MprOIl0ihILnoAqsCpdmFVMmNgazNM2H6NFxf2lIB5xTwUPddc41VkdVTc2oIvQ8KcLPZpYIz_JfWSdhp1ELc"
          }
        }
      ]
    }
  ],
  "status": 1
}
Mygod commented 1 year ago

This looks like a lot more data than was available in 275 protos. Apparently the proto was incorrect. Image also coincides with the start_poi.

Considering that start/end poi can be either stops or gyms, this should most definitely be a separate SQL table.

@TurtIeSocks Maybe the map could display the number of routes starting from each POI? (Maybe as a badge?) So it would be the # of routes with that start_poi + # of routes that is reversible and has that as end_poi but not start_poi.

na-ji commented 1 year ago

Image also coincides with the start_poi.

When creating a route you can chose which image you want to use between the start poi, the end poi and some others poi on the route.

Mygod commented 1 year ago

Revised the draft SQL scheme thanks to having new data. I'm guessing that it probably suffices to scan route once per day?

id string primary_key
start_poi string
end_poi string
waypoints json [{"fort_id": "id", "lat": 90, "lon": 90, "elevation": 8888}, ...]
name string
version int64
description string
type int8 (unset, organic, official, event, sponsored)
distance_m int64
duration_s int64
tags string[] ["a", "b"]
image string
image_border_color uint32
reversible bool
seen_ms int64

Some stuff that can potentially go to the table as well:

cell_id uint64
path_type int8 (unset, acyclic, loop) actually unused?
submission_ms int64
submission_status contains submission_update_ms int64
sponsor_info

aggregated_stats contains interesting stuff like ratings and travelled meters. Can anyone pull a route data with a non-empty aggregated_stats? Also is creator_info always empty?

jfberry commented 1 year ago

Needs some more route dumps for sure. The tags may have to be a json field for an array (represented as text/varchar in db) Not clear yet whether version matters. Since you obtain them like a GMO (it seems), and they could be quite big, it's unclear which modes will return them. Perhaps a 'raid scan' might ask for them alongside a GMO.

Mygod commented 1 year ago

It is not GMO. It's GetRoutesOutProto which is a response to a different method. I think scanning once a day is probably enough.

Also not sure how to store tags. Maybe the map would like to have filtering by tags? @TurtIeSocks Otherwise a json array should probably be fine.

jfberry commented 1 year ago

It is not GMO. It's GetRoutesOutProto which is a response to a different method. I think scanning once a day is probably enough.

Also not sure how to store tags. Maybe the map would like to have filtering by tags? @TurtIeSocks Otherwise a json array should probably be fine.

I didn't say it was in the GMO. You request it via cells like a GMO, and it could be asked for alongside a GMO in certain scan modes. These scan modes are predefined in the MITM/RDM interface so unless there is a new mode created, MITM implementors will choose to do this with - eg - raid requests (through GMO), but not during pokemon encountering. If you look at the /controler implementation in RDM you will see what I mean.

na-ji commented 1 year ago

Needs some more route dumps for sure.

Here are six routes from central park:

{
  "route_map_cell": [
    { "s2_cell_id": 9926594111408701440 },
    {
      "s2_cell_id": 9926594302534746112,
      "route": [
        {
          "id": "816eec82ba9b4657bc7e63f95d7a4139.20",
          "waypoints": [
            {
              "lat_degrees": 40.76359558105469,
              "lng_degrees": -73.97338104248047,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76393535733223,
              "lng_degrees": -73.9731253584226,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76403045654297,
              "lng_degrees": -73.97303771972656,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76472899829969,
              "lng_degrees": -73.97255185774218,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.765146443891965,
              "lng_degrees": -73.97224876752848,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76542439360189,
              "lng_degrees": -73.9720708521058,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76547619946079,
              "lng_degrees": -73.97201732305344,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.765834443124774,
              "lng_degrees": -73.97176764337988,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76619761636074,
              "lng_degrees": -73.97155829051592,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76654700361208,
              "lng_degrees": -73.9713248119661,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76707619917078,
              "lng_degrees": -73.97092748523664,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.767781630886276,
              "lng_degrees": -73.97042057434786,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76814684717303,
              "lng_degrees": -73.97012350687008,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76834345453797,
              "lng_degrees": -73.96999238406892,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76875947653307,
              "lng_degrees": -73.96968464333861,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.76920466932978,
              "lng_degrees": -73.9693322797626,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.77001859511434,
              "lng_degrees": -73.96875587205918,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.77029117864749,
              "lng_degrees": -73.96857053758643,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.770501817288604,
              "lng_degrees": -73.96840242934033,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.77103388421709,
              "lng_degrees": -73.96803874704932,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.77144133808163,
              "lng_degrees": -73.96771967875085,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.77210396569117,
              "lng_degrees": -73.96732778115579,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.77222547691657,
              "lng_degrees": -73.96726718903065,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.7723388671875,
              "lng_degrees": -73.96733093261719,
              "elevation_in_meters": -25.700000762939453
            },
            {
              "lat_degrees": 40.7724609375,
              "lng_degrees": -73.9672622680664,
              "elevation_in_meters": -25.700000762939453
            }
          ],
          "type": 1,
          "name": "a stroll down the outside of Central Park.",
          "version": 21,
          "description": "just a little walk I might take everyday every other take stuff on my mind and play Pokemon go and get my exercise.",
          "creator_info": {
            "creator_player_id": "1397c11bee81f2c1",
            "creator_codename": "GrwrNotaShwr7in",
            "show_creator_name": true
          },
          "reversible": true,
          "submission_time": 1689883593429,
          "route_distance_meters": 1117,
          "route_duration_seconds": 1574,
          "tags": [
            "route_tag_nature",
            "route_tag_parks_nearby",
            "route_tag_plenty_pokestops",
            "route_tag_stroller",
            "route_tag_public_transport"
          ],
          "player_stats": {},
          "image": {
            "image_url": "https://lh3.googleusercontent.com/2EI4qpKijz1fzCBKewubm42syF8UKiKhjsLj-tp-q1Juqvo0iBuFE_A_VVz1j5ezj96mHWcBnaENPlQlzxF_ANOsfA",
            "border_color_hex": "E7B649FF"
          },
          "route_submission_status": {
            "status": 2,
            "submission_status_update_time_ms": 1690321310194
          },
          "start_poi": {
            "anchor": {
              "fort_id": "42c1b038bf40496998f7e8f415f1456f.16",
              "lat_degrees": 40.763681,
              "lng_degrees": -73.973067
            },
            "image_url": "https://lh3.googleusercontent.com/mQ71g7i7nqHpPDEZrC10gC3NAUMimh-C9FNTxleYpmkHKJSPSEW09rDSgQLD709l9oNNgiwhgPI4B88ybePOVrJ-SG4"
          },
          "end_poi": {
            "anchor": {
              "fort_id": "3fdab8cfc43b4c95b16cf2a2411f0221.16",
              "lat_degrees": 40.772442,
              "lng_degrees": -73.967417
            },
            "image_url": "https://lh3.googleusercontent.com/kiMDQvKFultILZz8duiXP4RWDY4lmhagMZwIuuiIqMTBVAhZ4hp6ZtcG6HJDFQ-VeEqNwvWjlVoeTGDrnFfvFXKqXXo"
          }
        }
      ]
    },
    {
      "s2_cell_id": 9926594330452033536,
      "route": [
        {
          "id": "37403f9aea444bcbb992cc391d2dc1e9.20",
          "waypoints": [
            {
              "lat_degrees": 40.77298355102539,
              "lng_degrees": -73.97679901123047,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.773040771484375,
              "lng_degrees": -73.97676849365234,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77287292480469,
              "lng_degrees": -73.97669219970703,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77275085449219,
              "lng_degrees": -73.9767074584961,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77260971069336,
              "lng_degrees": -73.97666931152344,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.772579193115234,
              "lng_degrees": -73.97673034667969,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77241516113281,
              "lng_degrees": -73.97676849365234,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.772315979003906,
              "lng_degrees": -73.97685241699219,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77220916748047,
              "lng_degrees": -73.97700500488281,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77195739746094,
              "lng_degrees": -73.97718048095703,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.771732330322266,
              "lng_degrees": -73.97742462158203,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77165222167969,
              "lng_degrees": -73.97747039794922,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77165603637695,
              "lng_degrees": -73.97754669189453,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77154541015625,
              "lng_degrees": -73.97763061523438,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.7714729309082,
              "lng_degrees": -73.97779083251953,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77141571044922,
              "lng_degrees": -73.9778060913086,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.771385192871094,
              "lng_degrees": -73.97792053222656,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77118682861328,
              "lng_degrees": -73.97808837890625,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77116012573242,
              "lng_degrees": -73.97816467285156,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77101135253906,
              "lng_degrees": -73.97834014892578,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77093505859375,
              "lng_degrees": -73.9783706665039,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77079772949219,
              "lng_degrees": -73.97856140136719,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77053451538086,
              "lng_degrees": -73.97846984863281,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.77028274536133,
              "lng_degrees": -73.9784164428711,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.7701530456543,
              "lng_degrees": -73.97826385498047,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.7700309753418,
              "lng_degrees": -73.9782485961914,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76992416381836,
              "lng_degrees": -73.97830963134766,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76984786987305,
              "lng_degrees": -73.97821807861328,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.769859313964844,
              "lng_degrees": -73.97816467285156,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76975631713867,
              "lng_degrees": -73.97798919677734,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.769561767578125,
              "lng_degrees": -73.97821044921875,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76957321166992,
              "lng_degrees": -73.9782943725586,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76942825317383,
              "lng_degrees": -73.97845458984375,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76960754394531,
              "lng_degrees": -73.97872924804688,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.769710540771484,
              "lng_degrees": -73.97875213623047,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76976013183594,
              "lng_degrees": -73.97885131835938,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.770076751708984,
              "lng_degrees": -73.9791259765625,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.769752502441406,
              "lng_degrees": -73.97943878173828,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.769630432128906,
              "lng_degrees": -73.97949981689453,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.769309997558594,
              "lng_degrees": -73.97972869873047,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.769012451171875,
              "lng_degrees": -73.97982025146484,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76888656616211,
              "lng_degrees": -73.9798355102539,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.768741607666016,
              "lng_degrees": -73.979736328125,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76848220825195,
              "lng_degrees": -73.97943878173828,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76825714111328,
              "lng_degrees": -73.97928619384766,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.768211364746094,
              "lng_degrees": -73.97917175292969,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.767982482910156,
              "lng_degrees": -73.9789810180664,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76785659790039,
              "lng_degrees": -73.97872924804688,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.767765045166016,
              "lng_degrees": -73.9786376953125,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76771926879883,
              "lng_degrees": -73.97848510742188,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76765060424805,
              "lng_degrees": -73.97837829589844,
              "elevation_in_meters": 403.3999938964844
            },
            {
              "lat_degrees": 40.76761245727539,
              "lng_degrees": -73.97830200195312,
              "elevation_in_meters": 403.3999938964844
            }
          ],
          "type": 1,
          "name": "central park south",
          "version": 35,
          "description": "approaching the south end of Central park by the western side along the trail avoiding vehicular traffic",
          "creator_info": {
            "creator_player_id": "107728726368939637661",
            "creator_codename": "kloeyskye",
            "show_creator_name": true
          },
          "reversible": true,
          "submission_time": 1688655687420,
          "route_distance_meters": 959,
          "route_duration_seconds": 1308,
          "tags": [
            "route_tag_easy_going",
            "route_tag_pets",
            "route_tag_plenty_pokestops",
            "route_tag_sunny_day",
            "route_tag_flat"
          ],
          "aggregated_stats": {},
          "player_stats": {},
          "image": {
            "image_url": "http://lh3.googleusercontent.com/p9p0fJ50hYarKAuvqd6LId0GCHOpv2JjSCmKLZ_7CkORakmd6C6plXsqTk1ds7OHvt-XGs0ZvOdicJ-I2Iq_0-3Kpw",
            "border_color_hex": "F38A74FF"
          },
          "route_submission_status": {
            "status": 2,
            "submission_status_update_time_ms": 1688744699293
          },
          "start_poi": {
            "anchor": {
              "fort_id": "0e6608e450c249ceafbd17f9659a315e.16",
              "lat_degrees": 40.773026,
              "lng_degrees": -73.976687
            },
            "image_url": "http://lh3.googleusercontent.com/rRqd_IkqFAMZTA8brHa_ckq7CWENWD95yjy6AyPnQMPH-n6TBDa3ghKsJLGhPcYAgGDM6XmRaLn1WOLuA15tLYkGMDX2"
          },
          "end_poi": {
            "anchor": {
              "fort_id": "73cef0bf34d54069a49103436f0fb466.16",
              "lat_degrees": 40.767609,
              "lng_degrees": -73.97806
            },
            "image_url": "http://lh3.googleusercontent.com/p9p0fJ50hYarKAuvqd6LId0GCHOpv2JjSCmKLZ_7CkORakmd6C6plXsqTk1ds7OHvt-XGs0ZvOdicJ-I2Iq_0-3Kpw"
          }
        }
      ]
    },
    {
      "s2_cell_id": 9926593879480467456,
      "route": [
        {
          "id": "6a05cf3e88894104b33eb210f070424d.20",
          "waypoints": [
            {
              "lat_degrees": 40.77387237548828,
              "lng_degrees": -73.9804458618164,
              "elevation_in_meters": 26.119019420817494
            },
            {
              "lat_degrees": 40.7745475769043,
              "lng_degrees": -73.9820327758789,
              "elevation_in_meters": 25.12809548061341
            },
            {
              "lat_degrees": 40.77466583251953,
              "lng_degrees": -73.9823226928711,
              "elevation_in_meters": 24.991500034928322
            },
            {
              "lat_degrees": 40.7747917175293,
              "lng_degrees": -73.98247528076172,
              "elevation_in_meters": 25.3260047249496
            },
            {
              "lat_degrees": 40.774906158447266,
              "lng_degrees": -73.98255920410156,
              "elevation_in_meters": 23.87569512333721
            },
            {
              "lat_degrees": 40.77513122558594,
              "lng_degrees": -73.98309326171875,
              "elevation_in_meters": 23.83983427658677
            },
            {
              "lat_degrees": 40.775150299072266,
              "lng_degrees": -73.98348236083984,
              "elevation_in_meters": 23.257010916247964
            },
            {
              "lat_degrees": 40.77533721923828,
              "lng_degrees": -73.98358154296875,
              "elevation_in_meters": 22.458588153123856
            },
            {
              "lat_degrees": 40.77540969848633,
              "lng_degrees": -73.98375701904297,
              "elevation_in_meters": 22.422750059515238
            },
            {
              "lat_degrees": 40.77536392211914,
              "lng_degrees": -73.98385620117188,
              "elevation_in_meters": 20.601441857405007
            },
            {
              "lat_degrees": 40.775203704833984,
              "lng_degrees": -73.98397827148438,
              "elevation_in_meters": 20.94851355161518
            },
            {
              "lat_degrees": 40.774993896484375,
              "lng_degrees": -73.98417663574219,
              "elevation_in_meters": 20.24711493961513
            },
            {
              "lat_degrees": 40.77467727661133,
              "lng_degrees": -73.984375,
              "elevation_in_meters": 20.829990820027888
            },
            {
              "lat_degrees": 40.77482604980469,
              "lng_degrees": -73.98431396484375,
              "elevation_in_meters": 21.051362183876336
            },
            {
              "lat_degrees": 40.77491760253906,
              "lng_degrees": -73.98420715332031,
              "elevation_in_meters": 20.7436327598989
            },
            {
              "lat_degrees": 40.77503967285156,
              "lng_degrees": -73.98412322998047,
              "elevation_in_meters": 20.97754890471697
            },
            {
              "lat_degrees": 40.775150299072266,
              "lng_degrees": -73.9839859008789,
              "elevation_in_meters": 21.194960426539183
            },
            {
              "lat_degrees": 40.77531051635742,
              "lng_degrees": -73.98387145996094,
              "elevation_in_meters": 22.16826954856515
            },
            {
              "lat_degrees": 40.77534103393555,
              "lng_degrees": -73.98390197753906,
              "elevation_in_meters": 21.40653837658465
            },
            {
              "lat_degrees": 40.77581024169922,
              "lng_degrees": -73.98350524902344,
              "elevation_in_meters": 23.282630226574838
            },
            {
              "lat_degrees": 40.77632141113281,
              "lng_degrees": -73.9831314086914,
              "elevation_in_meters": 24.45129856094718
            },
            {
              "lat_degrees": 40.77657699584961,
              "lng_degrees": -73.98298645019531,
              "elevation_in_meters": 23.660756085067987
            },
            {
              "lat_degrees": 40.77666091918945,
              "lng_degrees": -73.98290252685547,
              "elevation_in_meters": 25.12324005458504
            },
            {
              "lat_degrees": 40.777069091796875,
              "lng_degrees": -73.9828872680664,
              "elevation_in_meters": 24.96886550541967
            },
            {
              "lat_degrees": 40.77714920043945,
              "lng_degrees": -73.98282623291016,
              "elevation_in_meters": 25.226016481406987
            },
            {
              "lat_degrees": 40.77720260620117,
              "lng_degrees": -73.98258972167969,
              "elevation_in_meters": 25.01934458501637
            },
            {
              "lat_degrees": 40.77732849121094,
              "lng_degrees": -73.98246002197266,
              "elevation_in_meters": 24.782531667500734
            },
            {
              "lat_degrees": 40.7774658203125,
              "lng_degrees": -73.98237609863281,
              "elevation_in_meters": 24.66274426225573
            },
            {
              "lat_degrees": 40.7775993347168,
              "lng_degrees": -73.98223876953125,
              "elevation_in_meters": 24.640446765348315
            },
            {
              "lat_degrees": 40.77777862548828,
              "lng_degrees": -73.9821548461914,
              "elevation_in_meters": 24.94437239319086
            }
          ],
          "type": 1,
          "name": "Lincoln Square Stroll",
          "version": 71,
          "description": "I don't know what this feature is. Sorry if I did a bad job.",
          "creator_info": {},
          "reversible": true,
          "submission_time": 1688175846515,
          "route_distance_meters": 845,
          "route_duration_seconds": 1157,
          "aggregated_stats": {},
          "player_stats": {},
          "image": {
            "image_url": "http://lh3.googleusercontent.com/vwjeH_RXShfRcOhaui_ZUqngSvbCcQL_egxjWosZg0gzP9FyK7hRsTfxrA5nLtgHhfJHX69QlFKjDJS_dwvng16USg",
            "border_color_hex": "9059FBFF"
          },
          "route_submission_status": {
            "status": 2,
            "submission_status_update_time_ms": 1688738562071
          },
          "start_poi": {
            "anchor": {
              "fort_id": "f97040bec0e14737b9b8305e481464ea.16",
              "lat_degrees": 40.773999,
              "lng_degrees": -73.980164
            },
            "image_url": "http://lh3.googleusercontent.com/vwjeH_RXShfRcOhaui_ZUqngSvbCcQL_egxjWosZg0gzP9FyK7hRsTfxrA5nLtgHhfJHX69QlFKjDJS_dwvng16USg"
          },
          "end_poi": {
            "anchor": {
              "fort_id": "9248dfbd53c043739512f04755b59c49.16",
              "lat_degrees": 40.77802,
              "lng_degrees": -73.981828
            },
            "image_url": "http://lh3.googleusercontent.com/eha0F14pww0YEslEF6kERx0jKbXsOIsARkE7p3WoGuZKpyyzmyMyRj3gKPLE1fJi9ztVbhObjOk6NYgc-ckzIma96bPU"
          }
        }
      ]
    },
    {
      "s2_cell_id": 9926593892365369344,
      "route": [
        {
          "id": "9237e600c2084634819669352a65e940.20",
          "waypoints": [
            {
              "lat_degrees": 40.77520751953125,
              "lng_degrees": -73.97142791748047
            },
            {
              "lat_degrees": 40.77531433105469,
              "lng_degrees": -73.9714584350586
            },
            {
              "lat_degrees": 40.77552032470703,
              "lng_degrees": -73.9715805053711
            },
            {
              "lat_degrees": 40.77574920654297,
              "lng_degrees": -73.97176361083984
            },
            {
              "lat_degrees": 40.77593231201172,
              "lng_degrees": -73.97183227539062
            },
            {
              "lat_degrees": 40.77600860595703,
              "lng_degrees": -73.97183227539062
            },
            {
              "lat_degrees": 40.776092529296875,
              "lng_degrees": -73.9719467163086
            },
            {
              "lat_degrees": 40.77627944946289,
              "lng_degrees": -73.97180938720703
            },
            {
              "lat_degrees": 40.77645492553711,
              "lng_degrees": -73.97176361083984
            },
            {
              "lat_degrees": 40.77661895751953,
              "lng_degrees": -73.97168731689453
            },
            {
              "lat_degrees": 40.776859283447266,
              "lng_degrees": -73.97167205810547
            },
            {
              "lat_degrees": 40.77703094482422,
              "lng_degrees": -73.9714584350586
            },
            {
              "lat_degrees": 40.777122497558594,
              "lng_degrees": -73.97138977050781
            },
            {
              "lat_degrees": 40.77719497680664,
              "lng_degrees": -73.97122192382812
            },
            {
              "lat_degrees": 40.77741622924805,
              "lng_degrees": -73.97116088867188
            },
            {
              "lat_degrees": 40.776981353759766,
              "lng_degrees": -73.97110748291016
            },
            {
              "lat_degrees": 40.77721405029297,
              "lng_degrees": -73.9713134765625
            },
            {
              "lat_degrees": 40.77745056152344,
              "lng_degrees": -73.97127532958984
            },
            {
              "lat_degrees": 40.77753448486328,
              "lng_degrees": -73.97122955322266
            },
            {
              "lat_degrees": 40.77771759033203,
              "lng_degrees": -73.97122955322266
            },
            {
              "lat_degrees": 40.77776336669922,
              "lng_degrees": -73.97119140625
            },
            {
              "lat_degrees": 40.777915954589844,
              "lng_degrees": -73.97118377685547
            },
            {
              "lat_degrees": 40.777984619140625,
              "lng_degrees": -73.97114562988281
            },
            {
              "lat_degrees": 40.77836990356445,
              "lng_degrees": -73.97110748291016
            },
            {
              "lat_degrees": 40.7784309387207,
              "lng_degrees": -73.97127532958984
            },
            {
              "lat_degrees": 40.778541564941406,
              "lng_degrees": -73.97138977050781
            },
            {
              "lat_degrees": 40.77860641479492,
              "lng_degrees": -73.97150421142578
            },
            {
              "lat_degrees": 40.778629302978516,
              "lng_degrees": -73.97162628173828
            },
            {
              "lat_degrees": 40.778724670410156,
              "lng_degrees": -73.9717025756836
            },
            {
              "lat_degrees": 40.778785705566406,
              "lng_degrees": -73.97187805175781
            },
            {
              "lat_degrees": 40.778724670410156,
              "lng_degrees": -73.97201538085938
            },
            {
              "lat_degrees": 40.77871322631836,
              "lng_degrees": -73.97229766845703
            },
            {
              "lat_degrees": 40.778594970703125,
              "lng_degrees": -73.97251892089844
            },
            {
              "lat_degrees": 40.77850341796875,
              "lng_degrees": -73.97264099121094
            },
            {
              "lat_degrees": 40.7783088684082,
              "lng_degrees": -73.97282409667969
            },
            {
              "lat_degrees": 40.77827835083008,
              "lng_degrees": -73.97293853759766
            },
            {
              "lat_degrees": 40.77804183959961,
              "lng_degrees": -73.97317504882812
            },
            {
              "lat_degrees": 40.777957916259766,
              "lng_degrees": -73.97339630126953
            },
            {
              "lat_degrees": 40.77790451049805,
              "lng_degrees": -73.97340393066406
            },
            {
              "lat_degrees": 40.77775955200195,
              "lng_degrees": -73.97357940673828
            },
            { "lat_degrees": 40.77775573730469, "lng_degrees": -73.9736328125 },
            {
              "lat_degrees": 40.777549743652344,
              "lng_degrees": -73.97383117675781
            },
            {
              "lat_degrees": 40.777503967285156,
              "lng_degrees": -73.97394561767578
            },
            {
              "lat_degrees": 40.77739334106445,
              "lng_degrees": -73.97408294677734
            },
            {
              "lat_degrees": 40.77718734741211,
              "lng_degrees": -73.97410583496094
            },
            {
              "lat_degrees": 40.77714538574219,
              "lng_degrees": -73.97406005859375
            },
            {
              "lat_degrees": 40.776981353759766,
              "lng_degrees": -73.97403717041016
            },
            {
              "lat_degrees": 40.7768669128418,
              "lng_degrees": -73.97406005859375
            },
            {
              "lat_degrees": 40.776756286621094,
              "lng_degrees": -73.97401428222656
            },
            {
              "lat_degrees": 40.776519775390625,
              "lng_degrees": -73.9740219116211
            },
            {
              "lat_degrees": 40.77645492553711,
              "lng_degrees": -73.97399139404297
            },
            {
              "lat_degrees": 40.776214599609375,
              "lng_degrees": -73.97398376464844
            },
            {
              "lat_degrees": 40.77596664428711,
              "lng_degrees": -73.97393035888672
            },
            {
              "lat_degrees": 40.77583694458008,
              "lng_degrees": -73.97396087646484
            },
            {
              "lat_degrees": 40.77572250366211,
              "lng_degrees": -73.97391510009766
            },
            {
              "lat_degrees": 40.77552795410156,
              "lng_degrees": -73.97391510009766
            },
            {
              "lat_degrees": 40.774940490722656,
              "lng_degrees": -73.97379302978516
            },
            {
              "lat_degrees": 40.7747688293457,
              "lng_degrees": -73.9737319946289
            },
            {
              "lat_degrees": 40.774620056152344,
              "lng_degrees": -73.97364807128906
            },
            {
              "lat_degrees": 40.77434539794922,
              "lng_degrees": -73.97356414794922
            },
            {
              "lat_degrees": 40.774471282958984,
              "lng_degrees": -73.97335052490234
            },
            {
              "lat_degrees": 40.77446365356445,
              "lng_degrees": -73.97320556640625
            },
            {
              "lat_degrees": 40.774356842041016,
              "lng_degrees": -73.97309112548828
            },
            {
              "lat_degrees": 40.7745361328125,
              "lng_degrees": -73.97301483154297
            },
            {
              "lat_degrees": 40.775020599365234,
              "lng_degrees": -73.97294616699219
            },
            {
              "lat_degrees": 40.77519989013672,
              "lng_degrees": -73.97286987304688
            },
            {
              "lat_degrees": 40.775245666503906,
              "lng_degrees": -73.97290802001953
            },
            {
              "lat_degrees": 40.775264739990234,
              "lng_degrees": -73.97274017333984
            },
            {
              "lat_degrees": 40.77542495727539,
              "lng_degrees": -73.97228240966797
            },
            {
              "lat_degrees": 40.77540969848633,
              "lng_degrees": -73.97225189208984,
              "elevation_in_meters": 298.3999938964844
            }
          ],
          "type": 1,
          "name": "central park round 4",
          "version": 73,
          "description": "A big round in central park new york.",
          "creator_info": {},
          "submission_time": 1687635809617,
          "route_distance_meters": 1384,
          "route_duration_seconds": 1860,
          "tags": [
            "route_tag_easy_going",
            "route_tag_flat",
            "route_tag_nature",
            "route_tag_parks_nearby",
            "route_tag_sunny_day"
          ],
          "aggregated_stats": {},
          "player_stats": {},
          "image": {
            "image_url": "http://lh3.googleusercontent.com/rA4Bt2rPJ7WOfqY8PMY4c3q6qCJLcSYPKD5ekhfE2Qd-kdDf648h-J4GnvFdl_nQ5G78xU_xFaABOrgQ3Lm-2aRMlQ",
            "border_color_hex": "86EAA8FF"
          },
          "route_submission_status": {
            "status": 2,
            "submission_status_update_time_ms": 1689017888565
          },
          "start_poi": {
            "anchor": {
              "fort_id": "a13c73f5067e4a1d840c46f8701e26e7.16",
              "lat_degrees": 40.775377,
              "lng_degrees": -73.971347
            },
            "image_url": "http://lh3.googleusercontent.com/rA4Bt2rPJ7WOfqY8PMY4c3q6qCJLcSYPKD5ekhfE2Qd-kdDf648h-J4GnvFdl_nQ5G78xU_xFaABOrgQ3Lm-2aRMlQ"
          },
          "end_poi": {
            "anchor": {
              "fort_id": "96287c48c3504d52bbfad9566d2a334b.16",
              "lat_degrees": 40.775448,
              "lng_degrees": -73.972209
            },
            "image_url": "http://lh3.googleusercontent.com/H4aZ4OVielZAFKNE3Dfj6uj_gx8IlO8aYCQFul_kVBRM8q8azvp3Lz_U3eDk7bZaeY-iubMVfbRMGEQHGmIHKNHKCpdY"
          }
        }
      ]
    },
    {
      "s2_cell_id": 9926593924577624064,
      "route": [
        {
          "id": "937351c2f9e94f14ac9f853e35cbabb4.20",
          "waypoints": [
            {
              "lat_degrees": 40.77288055419922,
              "lng_degrees": -73.96461486816406,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.7728385925293,
              "lng_degrees": -73.96470069885254,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.77276611328125,
              "lng_degrees": -73.96470642089844,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.77268854777019,
              "lng_degrees": -73.96479161580405,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.77204591949914,
              "lng_degrees": -73.96520405344349,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.77102514615045,
              "lng_degrees": -73.96595479200299,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.77073979503688,
              "lng_degrees": -73.96614808143917,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.76941741606008,
              "lng_degrees": -73.96718349761765,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.76932128642129,
              "lng_degrees": -73.9672678782777,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.76941008866998,
              "lng_degrees": -73.967246973089,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.769278587928085,
              "lng_degrees": -73.96739902532332,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.76923650349914,
              "lng_degrees": -73.96740217442526,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.76894786810557,
              "lng_degrees": -73.96759583899625,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.76844773886211,
              "lng_degrees": -73.96797169527193,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.768411840234066,
              "lng_degrees": -73.96796740379213,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.767969202466894,
              "lng_degrees": -73.96829987948041,
              "elevation_in_meters": 554.300048828125
            },
            {
              "lat_degrees": 40.767588419207414,
              "lng_degrees": -73.96854727431618,
              "elevation_in_meters": 554.2606667354703
            },
            {
              "lat_degrees": 40.76679523736466,
              "lng_degrees": -73.96911164497655,
              "elevation_in_meters": 554.3010268429508
            },
            {
              "lat_degrees": 40.76675934112179,
              "lng_degrees": -73.96912725001926,
              "elevation_in_meters": 554.3053536267482
            }
          ],
          "type": 1,
          "name": "jp morgan",
          "version": 33,
          "description": "nice walk. saw a few people.",
          "creator_info": {
            "creator_player_id": "110747373944640859577",
            "creator_codename": "RLandis1127",
            "show_creator_name": true
          },
          "reversible": true,
          "submission_time": 1689915954892,
          "route_distance_meters": 802,
          "route_duration_seconds": 1164,
          "player_stats": {},
          "image": {
            "image_url": "https://lh3.googleusercontent.com/niCZJSYwGBlWk8mTsyv1oTWzjA-Jv3YhS2ixtYL6YO_ZSC0F4pLbVAX2yTkWi4qxWxFXRz0exaXl_UGoo4omeVmYKO8",
            "border_color_hex": "9059FBFF"
          },
          "route_submission_status": {
            "status": 2,
            "submission_status_update_time_ms": 1690220150945
          },
          "start_poi": {
            "anchor": {
              "fort_id": "fb21f9c83b8b47e78a2f932e777581fe.16",
              "lat_degrees": 40.772573,
              "lng_degrees": -73.964713
            },
            "image_url": "http://lh3.googleusercontent.com/rWIP6ZXfJZ2oP6t0lfjupDRTRWUaEgPohYexy0ZKojVU2KVL2YULB-Il_zKnXX7HQLxpkjG-EXKb_RYS553p42fqqw"
          },
          "end_poi": {
            "anchor": {
              "fort_id": "58c7cf24ed1c4b5dabb58709d28122d9.16",
              "lat_degrees": 40.766715,
              "lng_degrees": -73.969391
            },
            "image_url": "http://lh3.googleusercontent.com/niCZJSYwGBlWk8mTsyv1oTWzjA-Jv3YhS2ixtYL6YO_ZSC0F4pLbVAX2yTkWi4qxWxFXRz0exaXl_UGoo4omeVmYKO8"
          }
        }
      ]
    },
    {
      "s2_cell_id": 9926593991149617152,
      "route": [
        {
          "id": "fa933c6859274c42996bf75f52ff75df.20",
          "waypoints": [
            { "lat_degrees": 40.782936096191406, "lng_degrees": -73.951171875 },
            {
              "lat_degrees": 40.782958984375,
              "lng_degrees": -73.95120239257812
            },
            {
              "lat_degrees": 40.783226013183594,
              "lng_degrees": -73.9509506225586
            },
            {
              "lat_degrees": 40.783538818359375,
              "lng_degrees": -73.95075225830078
            },
            {
              "lat_degrees": 40.78385925292969,
              "lng_degrees": -73.95050811767578
            },
            {
              "lat_degrees": 40.784461975097656,
              "lng_degrees": -73.95006561279297
            },
            {
              "lat_degrees": 40.78460693359375,
              "lng_degrees": -73.94994354248047
            },
            {
              "lat_degrees": 40.78495407104492,
              "lng_degrees": -73.94972229003906
            },
            {
              "lat_degrees": 40.78507995605469,
              "lng_degrees": -73.94959259033203
            },
            {
              "lat_degrees": 40.78523254394531,
              "lng_degrees": -73.9494857788086
            },
            {
              "lat_degrees": 40.785396575927734,
              "lng_degrees": -73.94940948486328
            },
            {
              "lat_degrees": 40.785552978515625,
              "lng_degrees": -73.94925689697266
            },
            {
              "lat_degrees": 40.785823822021484,
              "lng_degrees": -73.94902801513672
            },
            {
              "lat_degrees": 40.78617477416992,
              "lng_degrees": -73.9488296508789
            },
            {
              "lat_degrees": 40.78647994995117,
              "lng_degrees": -73.94860076904297
            },
            {
              "lat_degrees": 40.786617279052734,
              "lng_degrees": -73.94847106933594
            },
            {
              "lat_degrees": 40.786766052246094,
              "lng_degrees": -73.9483871459961
            },
            {
              "lat_degrees": 40.78689956665039,
              "lng_degrees": -73.94823455810547
            },
            {
              "lat_degrees": 40.787078857421875,
              "lng_degrees": -73.94815826416016
            },
            {
              "lat_degrees": 40.78736877441406,
              "lng_degrees": -73.94791412353516
            },
            {
              "lat_degrees": 40.78754806518555,
              "lng_degrees": -73.94779205322266
            },
            {
              "lat_degrees": 40.78765869140625,
              "lng_degrees": -73.94767761230469
            },
            {
              "lat_degrees": 40.787811279296875,
              "lng_degrees": -73.94757080078125
            },
            {
              "lat_degrees": 40.78828811645508,
              "lng_degrees": -73.9471664428711
            },
            {
              "lat_degrees": 40.788326263427734,
              "lng_degrees": -73.9471206665039
            },
            {
              "lat_degrees": 40.78852081298828,
              "lng_degrees": -73.947021484375
            },
            {
              "lat_degrees": 40.78865051269531,
              "lng_degrees": -73.94689178466797
            },
            {
              "lat_degrees": 40.788814544677734,
              "lng_degrees": -73.94679260253906
            },
            {
              "lat_degrees": 40.78910446166992,
              "lng_degrees": -73.94656372070312
            },
            {
              "lat_degrees": 40.789306640625,
              "lng_degrees": -73.94630432128906
            },
            {
              "lat_degrees": 40.789485931396484,
              "lng_degrees": -73.94621276855469
            },
            {
              "lat_degrees": 40.78960037231445,
              "lng_degrees": -73.94606018066406
            },
            {
              "lat_degrees": 40.78980255126953,
              "lng_degrees": -73.94596099853516
            },
            {
              "lat_degrees": 40.79008483886719,
              "lng_degrees": -73.94573974609375
            },
            {
              "lat_degrees": 40.790496826171875,
              "lng_degrees": -73.94552612304688
            },
            {
              "lat_degrees": 40.7907829284668,
              "lng_degrees": -73.9452896118164
            },
            {
              "lat_degrees": 40.79106140136719,
              "lng_degrees": -73.94514465332031
            },
            {
              "lat_degrees": 40.791221618652344,
              "lng_degrees": -73.94500732421875
            },
            {
              "lat_degrees": 40.7913932800293,
              "lng_degrees": -73.94490051269531
            },
            {
              "lat_degrees": 40.791690826416016,
              "lng_degrees": -73.9446792602539
            },
            {
              "lat_degrees": 40.79182052612305,
              "lng_degrees": -73.94461059570312
            },
            {
              "lat_degrees": 40.7924690246582,
              "lng_degrees": -73.94413757324219
            },
            {
              "lat_degrees": 40.79261779785156,
              "lng_degrees": -73.94404602050781
            },
            {
              "lat_degrees": 40.792755126953125,
              "lng_degrees": -73.94391632080078
            },
            {
              "lat_degrees": 40.793148040771484,
              "lng_degrees": -73.94364929199219
            },
            {
              "lat_degrees": 40.79328155517578,
              "lng_degrees": -73.94353485107422
            },
            {
              "lat_degrees": 40.7935676574707,
              "lng_degrees": -73.9433364868164
            },
            {
              "lat_degrees": 40.79405212402344,
              "lng_degrees": -73.9429702758789
            },
            {
              "lat_degrees": 40.794132232666016,
              "lng_degrees": -73.9428939819336
            },
            {
              "lat_degrees": 40.794273376464844,
              "lng_degrees": -73.94283294677734
            },
            {
              "lat_degrees": 40.794437408447266,
              "lng_degrees": -73.94268798828125
            },
            {
              "lat_degrees": 40.79475784301758,
              "lng_degrees": -73.9425277709961
            }
          ],
          "type": 1,
          "name": "walk1",
          "version": 28,
          "description": "straight like walk ",
          "creator_info": {},
          "reversible": true,
          "submission_time": 1687465965810,
          "route_distance_meters": 1512,
          "route_duration_seconds": 2026,
          "aggregated_stats": {},
          "player_stats": {},
          "image": {
            "image_url": "http://lh3.googleusercontent.com/kbdqdRF0PGsBP_IuEPVWfEA4fWQxFqNQ6tdfFfCMW9Exm5Tcq_Xnbb4omScs59VfkAm09u0UBM1mqc9pzZYqjc7mmZyq",
            "border_color_hex": "9059FBFF"
          },
          "route_submission_status": {
            "status": 2,
            "submission_status_update_time_ms": 1687466541058
          },
          "start_poi": {
            "anchor": {
              "fort_id": "2f2ddc1c78d94299a6ee3b961996eec6.16",
              "lat_degrees": 40.78299,
              "lng_degrees": -73.951126
            },
            "image_url": "http://lh3.googleusercontent.com/kbdqdRF0PGsBP_IuEPVWfEA4fWQxFqNQ6tdfFfCMW9Exm5Tcq_Xnbb4omScs59VfkAm09u0UBM1mqc9pzZYqjc7mmZyq"
          },
          "end_poi": {
            "anchor": {
              "fort_id": "0586a1e2cef340d78a836f6b7c6f5197.16",
              "lat_degrees": 40.794796,
              "lng_degrees": -73.942635
            },
            "image_url": "http://lh3.googleusercontent.com/KHoF4oBgoAln41CffibiQh77avvPCkkUzdlamg-oLvdMpx_x5CqiVO1a5K-ZocBjdY2zP5YSRZxJyUMZI3AAanCqZKyt"
          }
        }
      ]
    }
  ],
  "status": 1
}

And if you need to test the decoding, here are the raws:

{
  "contents": [
    {
      "type": 1405,
      "payload": "CgsIgICAgISYluGJAQoLCICAgICsnZbhiQEKCwiAgICAtJ2W4YkBCgsIgICAgLydluGJAQoLCICAgIDEnZbhiQEK8QwIgICAgMydluGJARrjDAojODE2ZWVjODJiYTliNDY1N2JjN2U2M2Y5NWQ3YTQxMzkuMjASGxEAAACAvWFEQBkAAADgS35SwCEAAABAM7M5wBIbEQAAQKLIYURAGVZVla9HflLAIQAAAEAzsznAEhsRAAAAwMthREAZAAAAQEZ+UsAhAAAAQDOzOcASGxEAAMuj4mFEQBmrqiVKPn5SwCEAAABAM7M5wBIbEVaVlFHwYURAGR0H5VI5flLAIQAAAEAzsznAEhsRVgoxbflhREAZHcypaDZ+UsAhAAAAQDOzOcASGxF2RsUf+2FEQBk9aiWINX5SwCEAAABAM7M5wBIbEYav79wGYkRAGSro6XAxflLAIQAAAEAzsznAEhsRckV0wxJiREAZG/vSAi5+UsAhAAAAQDOzOcASGxErrlM2HmJEQBkETIsvKn5SwCEAAABAM7M5wBIbET99io0vYkRAGUD4CK0jflLAIQAAAEAzsznAEhsRJJAhq0ZiREAZIozlXht+UsAhAAAAQDOzOcASGxEckcmiUmJEQBmfxeeAFn5SwCEAAABAM7M5wBIbEQqrDBRZYkRAGXy871oUflLAIQAAAEAzsznAEhsRjRnltWZiREAZqKQtUA9+UsAhAAAAQDOzOcASGxHYWXFMdWJEQBlmIkKKCX5SwCEAAABAM7M5wBIbEfqpJfiPYkRAGVYToRgAflLAIQAAAEAzsznAEhsRGVi+5phiREAZYrNHD/19UsAhAAAAQDOzOcASGxGuYbXNn2JEQBmO2C5O+n1SwCEAAABAM7M5wBIbEf5oAj2xYkRAGZz1yVj0fVLAIQAAAEAzsznAEhsR6uv6lr5iREAZjvuEHu99UsAhAAAAQDOzOcASGxG04IBN1GJEQBnjJMiy6H1SwCEAAABAM7M5wBIbEVE/0EjYYkRAGVrYo7TnfVLAIQAAAEAzsznAEhsRAAAAANxiREAZAAAAwOh9UsAhAAAAQDOzOcASGxEAAAAA4GJEQBkAAACg531SwCEAAABAM7M5wBgBKiphIHN0cm9sbCBkb3duIHRoZSBvdXRzaWRlIG9mIENlbnRyYWwgUGFyay4wFTpzanVzdCBhIGxpdHRsZSB3YWxrIEkgbWlnaHQgdGFrZSBldmVyeWRheSBldmVyeSBvdGhlciB0YWtlIHN0dWZmIG9uIG15IG1pbmQgYW5kIHBsYXkgUG9rZW1vbiBnbyBhbmQgZ2V0IG15IGV4ZXJjaXNlLkIlChAxMzk3YzExYmVlODFmMmMxEg9HcndyTm90YVNod3I3aW4YAVABYNWVpaeXMWjdCHimDIoBEHJvdXRlX3RhZ19uYXR1cmWKARZyb3V0ZV90YWdfcGFya3NfbmVhcmJ5igEacm91dGVfdGFnX3BsZW50eV9wb2tlc3RvcHOKARJyb3V0ZV90YWdfc3Ryb2xsZXKKARpyb3V0ZV90YWdfcHVibGljX3RyYW5zcG9ydPoBAIICiAEKfGh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS8yRUk0cXBLaWp6MWZ6Q0JLZXd1Ym00MnN5RjhVS2lLaGpzTGotdHAtcTFKdXF2bzBpQnVGRV9BX1ZWejFqNWV6ajk2bUhXY0JuYUVOUGxRbHp4Rl9BTk9zZkESCEU3QjY0OUZGigIJCAIQ8qOB+JgxkgK4AQo3CiM0MmMxYjAzOGJmNDA0OTY5OThmN2U4ZjQxNWYxNDU2Zi4xNhHNyYtMwGFEQBlHdM+6Rn5SwBJ9aHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL21RNzFnN2k3bnFIcFBERVpyQzEwZ0MzTkFVTWltaC1DOUZOVHhsZVlwbWtIS0pTUFNFVzA5ckRTZ1FMRDcwOWw5b05OZ2l3aGdQSTRCODh5YmVQT1ZySi1TRzSaArgBCjcKIzNmZGFiOGNmYzQzYjRjOTViMTZjZjJhMjQxMWYwMjIxLjE2EUYHJGHfYkRAGQsm/ijqfVLAEn1odHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20va2lNRFF2S0Z1bHRJTFp6OGR1aVhQNFJXRFk0bG1oYWdNWndJdXVpSXFNVEJWQWhaNGhwNlp0Y0c2SEpERlEtVmVFcU53dldqbFZvZVRHRHJuRmZ2RlhLcVhYbwoLCICAgIDUnZbhiQEKCwiAgICA3J2W4YkBCgsIgICAgKSeluGJAQoLCICAgICsnpbhiQEKzRIIgICAgLSeluGJARq/EgojMzc0MDNmOWFlYTQ0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eV9kYXmKAQ5yb3V0ZV90YWdfZmxhdPIBAPoBAIIChwEKe2h0dHA6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL3A5cDBmSjUwaFlhcktBdXZxZDZMSWQwR0NIT3B2MkpqU0NtS0xaXzdDa09SYWttZDZDNnBsWHNxVGsxZHM3T0h2dC1YR3MwWnZPZGljSi1JMklxXzAtM0twdxIIRjM4QTc0RkaKAgkIAhCdy5yIkzGSArgBCjcKIzBlNjYwOGU0NTBjMjQ5Y2VhZmJkMTdmOTY1OWEzMTVlLjE2EZZ6FoTyYkRAGWrbMAqCflLAEn1odHRwOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9yUnFkX0lrcUZBTVpUQThickhhX2NrcTdDV0VOV0Q5NXlqeTZBeVBuUU1QSC1uNlRCRGEzZ2hLc0pMR2hQY1lBZ0dETTZYbVJhTG4xV09MdUExNXRMWWtHTURYMpoCtgEKNwojNzNjZWYwYmYzNGQ1NDA2OWE0OTEwMzQzNmYwZmI0NjYuMTYRwY7/AkFiREAZpmH4iJh+UsASe2h0dHA6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL3A5cDBmSjUwaFlhcktBdXZxZDZMSWQwR0NIT3B2MkpqU0NtS0xaXzdDa09SYWttZDZDNnBsWHNxVGsxZHM3T0h2dC1YR3MwWnZPZGljSi1JMklxXzAtM0twdwoLCICAgIDMnpbhiQEKCwiAgICApJCW4YkBCgsIgICAgKyQluGJAQoLCICAgIC0kJbhiQEKCwiAgICAvJCW4YkBCgsIgICAgJSQluGJAQoLCICAgIDkkJbhiQEKCwiAgICA7JCW4YkBCgsIgICAgPSQluGJAQoLCICAgID8kJbhiQEKCwiAgICAxJCW4YkBCgsIgICAgMyQluGJAQoLCICAgIDUkJbhiQEKCwiAgICA3JCW4YkBCpYMCICAgICkkZbhiQEaiAwKIzZhMDVjZjNlODg4OTQxMDRiMzNlYjIxMGYwNzA0MjRkLjIwEhsRAAAAQA5jREAZAAAAoL9+UsAhAACIDngeOkASGxEAAABgJGNEQBkAAACg2X5SwCEAAIzdyiA5QBIbEQAAAEAoY0RAGQAAAGDeflLAIQAAQPLS/ThAEhsRAAAAYCxjREAZAAAA4OB+UsAhAACw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UoFAEhsRowKLKyViREAZsB9NLgZ+UsAhygQ+XXFSgUAYASoJanAgbW9yZ2FuMCE6HG5pY2Ugd2Fsay4gc2F3IGEgZmV3IHBlb3BsZS5CJgoVMTEwNzQ3MzczOTQ0NjQwODU5NTc3EgtSTGFuZGlzMTEyNxgBUAFgzK3ctpcxaKIGeIwJ+gEAggKJAQp9aHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL25pQ1pKU1l3R0JsV2s4bVRzeXYxb1RXempBLUp2M1loUzJpeHRZTDZZT19aU0MwRjRwTGJWQVgyeVRrV2k0cXhXeEZYUnowZXhhWGxfVUdvbzRvbWVWbVlLTzgSCDkwNTlGQkZGigIJCAIQoYHjx5gxkgK2AQo3CiNmYjIxZjljODNiOGI0N2U3OGEyZjkzMmU3Nzc1ODFmZS4xNhHlYgys42JEQBmrQZjbvX1SwBJ7aHR0cDovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vcldJUDZaWGZKWjJvUDZ0MGxmanVwRFJUUldVYUVnUG9oWWV4eTBaS29qVlUyS1ZMMllVTEItSWxfektuWFg3SFFMeHBrakctRVhLYl9SWVM1NTNwNDJmcXF3mgK3AQo3CiM1OGM3Y2YyNGVkMWM0YjVkYWJiNTg3MDlkMjgxMjJkOS4xNhEjLZW3I2JEQBlagoyACn5SwBJ8aHR0cDovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vbmlDWkpTWXdHQmxXazhtVHN5djFvVFd6akEtSnYzWWhTMml4dFlMNllPX1pTQzBGNHBMYlZBWDJ5VGtXaTRxeFd4RlhSejBleGFYbF9VR29vNG9tZVZtWUtPOAoLCICAgIDUkpbhiQEKCwiAgICA3JKW4YkBCgsIgICAgKSTluGJAQoLCICAgICsk5bhiQEKCwiAgICAtJOW4YkBCgsIgICAgLyTluGJAQoLCICAgICEk5bhiQEKCwiAgICAjJOW4YkBCgsIgICAgJSTluGJAQoLCICAgICck5bhiQEKCwiAgICA5JOW4YkBCgsIgICAgOyTluGJAQoLCICAgID0k5bhiQEKCwiAgICA/JOW4YkBCgsIgICAgMSTluGJAQoLCICAgIDMk5bhiQEKCwiAgICA1JOW4YkBCgsIgICAgNyTluGJAQoLCICAgICklJbhiQEKCwiAgICArJSW4YkBCgsIgICAgLSUluGJAQoLCICAgIC8lJbhiQEKCwiAgICAhJSW4YkBCgsIgICAgIyUluGJAQoLCICAgICUlJbhiQEKCwiAgICAnJSW4YkBCgsIgICAgOyUluGJAQqLDQiAgICAxJSW4YkBGv0MCiNmYTkzM2M2ODU5Mjc0YzQyOTk2YmY3NWY1MmZmNzVkZi4yMBISEQAAAEA3ZERAGQAAAADgfFLAEhIRAAAAADhkREAZAAAAgOB8UsASEhEAAADAQGREQBkAAABg3HxSwBISEQAAAABLZERAGQAAACDZfFLAEhIRAAAAgFVkREAZAAAAINV8UsASEhEAAABAaWREQBkAAADgzXxSwBISEQAAAABuZERAGQAAAODLfFLAEhIRAAAAYHlkREAZAAAAQMh8UsASEhEAAACAfWREQBkAAAAgxnxSwBISEQAAAICCZERAGQAAAGDEfFLAEhIRAAAA4IdkREAZAAAAIMN8UsASEhEAAAAAjWREQBkAAACgwHxSwBISEQAAAOCVZERAGQAAAOC8fFLAEhIRAAAAYKFkREAZAAAAoLl8UsASEhEAAABgq2REQBkAAADgtXxSwBISEQAAAOCvZERAGQAAAMCzfFLAEhIRAAAAwLRkREAZAAAAYLJ8UsASEhEAAAAguWREQBkAAADgr3xSwBISEQAAAAC/ZERAGQAAAKCufFLAEhIRAAAAgMhkREAZAAAAoKp8UsASEhEAAABgzmREQBkAAACgqHxSwBISEQAAAADSZERAGQAAAMCmfFLAEhIRAAAAANdkREAZAAAAAKV8UsASEhEAAACg5mREQBkAAABgnnxSwBISEQAAAODnZERAGQAAAKCdfFLAEhIRAAAAQO5kREAZAAAAAJx8UsASEhEAAACA8mREQBkAAADgmXxSwBISEQAAAOD3ZERAGQAAAECYfFLAEhIRAAAAYAFlREAZAAAAgJR8UsASEhEAAAAACGVEQBkAAABAkHxSwBISEQAAAOANZURAGQAAAMCOfFLAEhIRAAAAoBFlREAZAAAAQIx8UsASEhEAAABAGGVEQBkAAACginxSwBISEQAAAIAhZURAGQAAAACHfFLAEhIRAAAAAC9lREAZAAAAgIN8UsASEhEAAABgOGVEQBkAAACgf3xSwBISEQAAAIBBZURAGQAAAEB9fFLAEhIRAAAAwEZlREAZAAAAAHt8UsASEhEAAABgTGVEQBkAAABAeXxSwBISEQAAACBWZURAGQAAAKB1fFLAEhIRAAAAYFplREAZAAAAgHR8UsASEhEAAACgb2VEQBkAAADAbHxSwBISEQAAAIB0ZURAGQAAAEBrfFLAEhIRAAAAAHllREAZAAAAIGl8UsASEhEAAADghWVEQBkAAADAZHxSwBISEQAAAECKZURAGQAAAOBifFLAEhIRAAAAoJNlREAZAAAAoF98UsASEhEAAACAo2VEQBkAAACgWXxSwBISEQAAACCmZURAGQAAAGBYfFLAEhIRAAAAwKplREAZAAAAYFd8UsASEhEAAAAgsGVEQBkAAAAAVXxSwBISEQAAAKC6ZURAGQAAAGBSfFLAGAEqBXdhbGsxMBw6E3N0cmFpZ2h0IGxpa2Ugd2FsayBCAFABYPLxvKaOMWjoC3jqD/IBAPoBAIICiQEKfWh0dHA6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2tiZHFkUkYwUEdzQlBfSXVFUFZXZkVBNGZXUXhGcU5RNnRkZkZmQ01XOUV4bTVUY3FfWG5iYjRvbVNjczU5VmZrQW0wOXUwVUJNMW1xYzlwelpZcWpjN21tWnlxEgg5MDU5RkJGRooCCQgCEIKA4KaOMZICuAEKNwojMmYyZGRjMWM3OGQ5NDI5OWE2ZWUzYjk2MTk5NmVlYzYuMTYRKowtBDlkREAZBRiWP998UsASfWh0dHA6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2tiZHFkUkYwUEdzQlBfSXVFUFZXZkVBNGZXUXhGcU5RNnRkZkZmQ01XOUV4bTVUY3FfWG5iYjRvbVNjczU5VmZrQW0wOXUwVUJNMW1xYzlwelpZcWpjN21tWnlxmgK4AQo3CiMwNTg2YTFlMmNlZjM0MGQ3OGE4MzZmNmI3YzZmNTE5Ny4xNhHtfhXgu2VEQBkoRMAhVHxSwBJ9aHR0cDovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vS0hvRjRvQmdvQWxuNDFDZmZpYmlRaDc3YXZ2UENra1V6ZGxhbWctb0x2ZE1weF94NUNxaVZPMWE1Sy1ab2NCamRZMnpQNVlTUlp4SnlVTVpJM0FBYW5DcVpLeXQKCwiAgICAzJSW4YkBCgsIgICAgLSXluGJAQoLCICAgIC8l5bhiQEKCwiAgICAlJeW4YkBCgsIgICAgOSXluGJAQoLCICAgIDsl5bhiQEKCwiAgICA9JeW4YkBCgsIgICAgPyXluGJAQoLCICAgIDEl5bhiQEKCwiAgICAzJeW4YkBCgsIgICAgNSXluGJAQoLCICAgIDcl5bhiQEKCwiAgICA/MO94YkBCgsIgICAgITEveGJAQoLCICAgICMxL3hiQEKCwiAgICA9MS94YkBCgsIgICAgPzEveGJARABGhsKGXJvdXRlX2Rpc2NvdmVyeV90YWJfa25vd24aHgoccm91dGVfZGlzY292ZXJ5X3RhYl9vZmZpY2lhbBr3AQoXcm91dGVfZGlzY292ZXJ5X3RhYl9uZXcSIzM3NDAzZjlhZWE0NDRiY2JiOTkyY2MzOTFkMmRjMWU5LjIwEiM2YTA1Y2YzZTg4ODk0MTA0YjMzZWIyMTBmMDcwNDI0ZC4yMBIjODE2ZWVjODJiYTliNDY1N2JjN2U2M2Y5NWQ3YTQxMzkuMjASIzkyMzdlNjAwYzIwODQ2MzQ4MTk2NjkzNTJhNjVlOTQwLjIwEiM5MzczNTFjMmY5ZTk0ZjE0YWM5Zjg1M2UzNWNiYWJiNC4yMBIjZmE5MzNjNjg1OTI3NGM0Mjk5NmJmNzVmNTJmZjc1ZGYuMjAaZwobcm91dGVfZGlzY292ZXJ5X3RhYl9wb3B1bGFyEiMzNzQwM2Y5YWVhNDQ0YmNiYjk5MmNjMzkxZDJkYzFlOS4yMBIjNmEwNWNmM2U4ODg5NDEwNGIzM2ViMjEwZjA3MDQyNGQuMjA="
    }
  ],
  "lat_target": 40.781316,
  "lon_target": -73.966574,
  "uuid": "tmtc",
  "username": "mightymygod",
  "trainerlvl": 30,
  "have_ar": true
}
na-ji commented 1 year ago

aggregated_stats contains interesting stuff like ratings and travelled meters. Can anyone pull a route data with a non-empty aggregated_stats? Also is creator_info always empty?

I have the impression those are personal stats for the account running the request.

Revised the draft SQL scheme thanks to having new data. I'm guessing that it probably suffices to scan route once per day?

id string primary_key
start_poi string
end_poi string
waypoints json [{"fort_id": "id", "lat": 90, "lon": 90, "elevation": 8888}, ...]
name string
version int64
description string
distance_m int64
duration_s int64
tags string[] ["a", "b"]
image string
image_border_color uint32
reversible bool
seen_ms int64

Some stuff that can potentially go to the table as well:

cell_id uint64
type int8 (unset, organic, official, event, sponsored)
path_type int8 (unset, acyclic, loop) actually unused?
submission_ms int64
submission_status contains submission_update_ms int64
sponsor_info

start_poi and end_poi will be just the POI ID? The type and path_type seem useful to me.

TurtIeSocks commented 1 year ago

Revised the draft SQL scheme thanks to having new data. I'm guessing that it probably suffices to scan route once per day?

id string primary_key
start_poi string
end_poi string
waypoints json [{"fort_id": "id", "lat": 90, "lon": 90, "elevation": 8888}, ...]
name string
version int64
description string
distance_m int64
duration_s int64
tags string[] ["a", "b"]
image string
image_border_color uint32
reversible bool
seen_ms int64

Some stuff that can potentially go to the table as well:

cell_id uint64
type int8 (unset, organic, official, event, sponsored)
path_type int8 (unset, acyclic, loop) actually unused?
submission_ms int64
submission_status contains submission_update_ms int64
sponsor_info

aggregated_stats contains interesting stuff like ratings and travelled meters. Can anyone pull a route data with a non-empty aggregated_stats? Also is creator_info always empty?

Do we need elevation?

Surely we don't need fort_id and lat/lon in the waypoints json? What will we do with the fort_ids? and if we're doing some kind of lookup with them, shouldn't we just store that ID instead of lat/lon too? Or is this not repeat info?

Mygod commented 1 year ago

@na-ji I still don't see any aggregated_stats. It is also not per-player stats. There's a separate field called player_stats for that. path_type never appears in your proto and we can probably just check if start_poi == end_poi instead to obtain that value.

@TurtIeSocks For elevation, it can be used for map to show how much uphill/downhill is on this route I guess. For waypoint, it will be a json so we can just pop a fort_id in there if it was set for some route. (It seems like it was almost never set though.)

Also I wonder if the border color is rgba or bgra?

jfberry commented 1 year ago

I don't see the forts anywhere but the start and end? Why do you have forts inside your waypoints? Furtif has updated the decoding names again (I think after naji's extract). Hopefully this will stabilise and we can get the protos into golbat ready for decoding.

Mygod commented 1 year ago

It's there in the protos so it could appear, maybe in non-curated event routes?

jfberry commented 1 year ago

It's there in the protos so it could appear, maybe in non-curated event routes?

Ok, I got it

message RouteWaypointProto {
    string fort_id = 1;
    double lat_degrees = 2;
    double lng_degrees = 3;
    double elevation_in_meters = 4;
}