Nice post! I'm not sure I entirely understand how you converted the PixelValuePositions results to lat-long, but you may be interested in a function in the Function Repository called OSMImport (https://resources.wolframcloud.com/FunctionRepository/resources/OSMImport).
OSMImport lets you import GIS data from OpenStreetMap, which almost certainly includes subway routes. I'm not sure if it would include depth, but if nothing else it would get you the lat-long coordinates for the routes.
Edit:
Here is an example. First, we get the OSM data for some region in Tokyo:
osm=ResourceFunction["OSMImport"][GeoBoundsRegion[{{35.695217,35.705217},{139.756822,139.766822}}]];
This use of OSMImport uses the OSM API, which is very limited in how much it can return (I think it's no more than 50,000 objects, which is quickly used up in even a small region of well-covered cities). If you wanted to do all of Tokyo, you can use a separate API to download the XML files for the whole city and then import then using OSMImport.
First, we can look at some of the railway-related Nodes:
Select[osm["Nodes"], KeyExistsQ[#Tags, "railway"] &]
which returns things like
<|"2559434143" -> <|"Position" -> GeoPosition[{35.6996, 139.765}],
"Tags" -> <|"maxspeed" -> "95", "name" -> "????",
"name:en" -> "Ochanomizu", "name:es" -> "Ochanomizu",
"name:fr" -> "Ochanomizu", "name:ja" -> "????",
"name:ja_kana" -> "??????", "name:ja_rm" -> "Ochanomizu",
"name:ko" -> "?????", "name:ru" -> "??????????",
"operator" -> "???????", "public_transport" -> "station",
"railway" -> "station", "source" -> "Bing, 2007-04",
"train" -> "yes", "wheelchair" -> "limited",
"wikidata" -> "Q801289",
"wikipedia" -> "ja:?????"|>|>, "2559434708" -> <|"Position" ->
GeoPosition[{35.7002, 139.763}],
"Tags" -> <|"railway" ->
"switch"|>|>, "4855419881" -> <|"Position" ->
GeoPosition[{35.6959, 139.757}],
"Tags" -> <|"name" -> "???", "name:en" -> "Jimbocho",
"name:es" -> "Jimbocho", "name:ja" -> "???",
"name:ja_kana" -> "???????", "name:ja_rm" -> "Jimb?ch?",
"name:ko" -> "???", "name:ru" -> "????????", "name:zh" -> "????",
"network" -> "?????????", "operator" -> "?????",
"public_transport" -> "stop_position", "railway" -> "stop",
"ref" -> "Z07", "subway" -> "yes",
"website" ->
"https://www.tokyometro.jp/lang_en/station/jimbocho/",
"wikidata" -> "Q76805",
"wikipedia" -> "ja:????"|>|>, "6070813705" -> <|"Position" ->
GeoPosition[{35.6996, 139.765}],
"Tags" -> <|"loc_ref" -> "2", "name" -> "????",
"name:en" -> "Ochanomizu", "name:es" -> "Ochanomizu",
"public_transport" -> "stop_position", "railway" -> "stop",
"train" -> "yes"|>|>,...|>
I haven't read through the full results, but I don't think it contains depth.
However, for the lat-long data, you can use the Ways parameter to get something like this:
GeoGraphics[{Thick,Red,Line@Values@osm[["Nodes",#Nodes,"Position"]]&/@Select[osm["Ways"],KeyExistsQ[#Tags,"railway"]&]}]
All of those routes are also internally tagged with properties like their name, gauge, max speed, operator, track voltage, passenger vs freight, etc.