简体   繁体   中英

How do I plot a GeoJSON feature collection of line strings in a mapbox using plotly express?

I have a GeoJSON feature collection where each feature is a line string. I want to plot this on a map using plotly express. I do not have pandas/geopandas installed and ideally would like to keep it that way (trying to keep this as simple as possible).

It seems like I should be able to use one of the following:
https://plotly.com/python/filled-area-on-mapbox/#geojson-layers
https://plotly.com/python/lines-on-mapbox/
https://plotly.com/python-api-reference/generated/plotly.express.line_geo.html
https://plotly.com/python/lines-on-maps/

But I can't get any of these examples to work. Here is my attempt where I am using update_layout to directly add my feature collection to the layers of a scatter map box which seems like it should work, but the expected line is nowhere to be found on the map.

import geojson
import plotly.express as px
import plotly.graph_objects as go


featureCollection = geojson.FeatureCollection([{"type": "LineString", "coordinates": [[42.606938, -0.248537], [42.606992, -0.248266], [42.6071, -0.247995], [42.607207, -0.247724], [42.607315, -0.247453], [42.607477, -0.247182], [42.607692, -0.24691], [42.607908, -0.246639], [42.608177, -0.246368], [42.608447, -0.246151], [42.608716, -0.245934], [42.608986, -0.245718], [42.609255, -0.245555], [42.609524, -0.245392], [42.609794, -0.245175], [42.610063, -0.244958], [42.610333, -0.244796], [42.610602, -0.244579], [42.610871, -0.244362], [42.611141, -0.244199], [42.61141, -0.244037], [42.61168, -0.243874], [42.611949, -0.243766], [42.612218, -0.243711], [42.612488, -0.243603], [42.612757, -0.243549], [42.613026, -0.243495], [42.613296, -0.24344], [42.613565, -0.243332], [42.613835, -0.243332], [42.614104, -0.243278], [42.614373, -0.243224], [42.614643, -0.243115], [42.614912, -0.243115], [42.615182, -0.243007], [42.615451, -0.242898], [42.61572, -0.24279], [42.61599, -0.242736], [42.616259, -0.242627], [42.616528, -0.242519], [42.616798, -0.242465], [42.617067, -0.242411], [42.617337, -0.242302], [42.617606, -0.242194], [42.617875, -0.24214], [42.618145, -0.24214], [42.618414, -0.242085], [42.618684, -0.242031], [42.618953, -0.241977], [42.619222, -0.241923], [42.619492, -0.241869], [42.619761, -0.241814], [42.62003, -0.241814], [42.6203, -0.241815], [42.620569, -0.24176], [42.620839, -0.241706], [42.621108, -0.241652], [42.621377, -0.241544], [42.621647, -0.241435], [42.621916, -0.241327], [42.622186, -0.24111], [42.622455, -0.240893], [42.622724, -0.240676], [42.622886, -0.240405], [42.622994, -0.240134], [42.623048, -0.239862], [42.622994, -0.239591], [42.622832, -0.23932], [42.622725, -0.239049], [42.622348, -0.238615], [42.622348, -0.238615], [42.622132, -0.238452], [42.622132, -0.238452], [42.621647, -0.238127], [42.621378, -0.237964], [42.621109, -0.237747], [42.620839, -0.23753], [42.62057, -0.237313], [42.620301, -0.23715], [42.620031, -0.237042], [42.619762, -0.236879], [42.619493, -0.23677], [42.619223, -0.236716], [42.618954, -0.236662], [42.618684, -0.236553], [42.618415, -0.236499], [42.618146, -0.23639], [42.617876, -0.236282], [42.617445, -0.235956], [42.617445, -0.235956], [42.617284, -0.235739], [42.617284, -0.235739], [42.616961, -0.235251], [42.616853, -0.23498], [42.616638, -0.234709], [42.616422, -0.234438], [42.616261, -0.234166], [42.616099, -0.233895], [42.615883, -0.233624], [42.615668, -0.233353], [42.61556, -0.233082], [42.615453, -0.23281], [42.615399, -0.232539], [42.615399, -0.232268], [42.615453, -0.231997], [42.615453, -0.231726], [42.615453, -0.231454], [42.615453, -0.231183], [42.615399, -0.230912], [42.615345, -0.230641], [42.615291, -0.23037], [42.615238, -0.230099], [42.615184, -0.229827], [42.615184, -0.229556], [42.615184, -0.229285], [42.615184, -0.229014], [42.615184, -0.228743], [42.615184, -0.228471], [42.615184, -0.2282], [42.61513, -0.227929], [42.615076, -0.227658], [42.615023, -0.227387], [42.614969, -0.227115], [42.614915, -0.226844], [42.614915, -0.226573], [42.614915, -0.226302], [42.614915, -0.226031], [42.614915, -0.22576], [42.614915, -0.225488], [42.614915, -0.225217], [42.614915, -0.224946], [42.614915, -0.224675], [42.614915, -0.224404], [42.614915, -0.224132], [42.614915, -0.223861], [42.614969, -0.22359], [42.615023, -0.223319], [42.615077, -0.223048], [42.615185, -0.222777], [42.615293, -0.222505], [42.615347, -0.222234], [42.615454, -0.221963], [42.615562, -0.221692], [42.61567, -0.221421], [42.615778, -0.22115], [42.615939, -0.220878], [42.616047, -0.220607], [42.616209, -0.220336], [42.616317, -0.220065], [42.616478, -0.219794], [42.61664, -0.219577], [42.616856, -0.21936], [42.616856, -0.21936], [42.617233, -0.218926], [42.617341, -0.218709], [42.617394, -0.218438], [42.617448, -0.218167], [42.617502, -0.217896], [42.61761, -0.217625], [42.617772, -0.217353], [42.617933, -0.217082], [42.618095, -0.216811], [42.618203, -0.21654], [42.618311, -0.216269], [42.618365, -0.215998], [42.618418, -0.215726], [42.618419, -0.215455], [42.618419, -0.215184], [42.618419, -0.214913], [42.618419, -0.214642], [42.618365, -0.21437], [42.618311, -0.214099], [42.618257, -0.213828], [42.618149, -0.213557], [42.617988, -0.213286], [42.61788, -0.213014], [42.617719, -0.212743], [42.617557, -0.212472], [42.617395, -0.212201], [42.617288, -0.21193], [42.617126, -0.211658], [42.616965, -0.211387], [42.616803, -0.211116], [42.616641, -0.210845], [42.616426, -0.210574], [42.61621, -0.210302], [42.615995, -0.210031], [42.615726, -0.20976], [42.615456, -0.209489], [42.615187, -0.209217], [42.614972, -0.208946], [42.614756, -0.208675], [42.614541, -0.208404], [42.614325, -0.208133], [42.61411, -0.207861], [42.613894, -0.20759], [42.613733, -0.207319], [42.613571, -0.207048], [42.61341, -0.206777], [42.613302, -0.206505], [42.61314, -0.206234], [42.612925, -0.205963], [42.612709, -0.205692], [42.612494, -0.20542], [42.612225, -0.205149], [42.611955, -0.204878], [42.611686, -0.204607], [42.611417, -0.204336], [42.611147, -0.204064], [42.610878, -0.203793], [42.610609, -0.203522], [42.610339, -0.203251], [42.61007, -0.202979], [42.609801, -0.202763], [42.609531, -0.202654], [42.609262, -0.202545], [42.608993, -0.202437], [42.608723, -0.202328], [42.608454, -0.202166], [42.608185, -0.201894], [42.607969, -0.201623], [42.607754, -0.201352], [42.607592, -0.201081], [42.60743, -0.20081], [42.607323, -0.200538], [42.607215, -0.200267], [42.607161, -0.199996], [42.607053, -0.199725], [42.607, -0.199454], [42.606946, -0.199182], [42.606892, -0.198911], [42.606838, -0.19864], [42.606892, -0.198369], [42.606946, -0.198098], [42.607, -0.197827], [42.607054, -0.197555], [42.607162, -0.197284], [42.607215, -0.197013], [42.607269, -0.196742], [42.607377, -0.196471], [42.607539, -0.1962], [42.607647, -0.195928], [42.607808, -0.195657], [42.608024, -0.195386], [42.608239, -0.195115], [42.608455, -0.194844], [42.60867, -0.194573], [42.609101, -0.194085], [42.609101, -0.194085], [42.609317, -0.193868], [42.609317, -0.193868], [42.609802, -0.193434], [42.610071, -0.193271], [42.610341, -0.193054], [42.61061, -0.192837], [42.61088, -0.19262], [42.611095, -0.192404], [42.611311, -0.192132], [42.611526, -0.191861], [42.611688, -0.19159], [42.611849, -0.191319], [42.612065, -0.191048], [42.612227, -0.190777], [42.612388, -0.190505], [42.61255, -0.190234], [42.612712, -0.189963], [42.612873, -0.189692], [42.613035, -0.189421], [42.613143, -0.18915], [42.61325, -0.188878], [42.613358, -0.188607], [42.613412, -0.188336], [42.613466, -0.188065], [42.61352, -0.187794], [42.613628, -0.187523], [42.613682, -0.187251], [42.613736, -0.18698], [42.61379, -0.186709], [42.613843, -0.186438], [42.613843, -0.186167], [42.613844, -0.185896], [42.613897, -0.185624], [42.613951, -0.185353], [42.614005, -0.185082], [42.614113, -0.184811], [42.614221, -0.18454], [42.614275, -0.184269], [42.614383, -0.183997], [42.61449, -0.183726], [42.614598, -0.183455], [42.614706, -0.183184], [42.614868, -0.182913], [42.614975, -0.182642], [42.615083, -0.18237], [42.615191, -0.182099], [42.615353, -0.181828], [42.615514, -0.181557], [42.615676, -0.181286], [42.615891, -0.181015], [42.616107, -0.180743], [42.616215, -0.180472], [42.616269, -0.180201], [42.616269, -0.17993], [42.616161, -0.179659], [42.615945, -0.179387], [42.61573, -0.179116], [42.615461, -0.178845], [42.615191, -0.178574], [42.614922, -0.178357], [42.614653, -0.178194], [42.614383, -0.178086], [42.614114, -0.177977], [42.613845, -0.177923], [42.613575, -0.177814], [42.613306, -0.177706], [42.613036, -0.177597], [42.612767, -0.177543], [42.612498, -0.177489], [42.612228, -0.177489], [42.611959, -0.177489], [42.61169, -0.177489], [42.61142, -0.177489], [42.611151, -0.177489], [42.610882, -0.177489], [42.610612, -0.177488], [42.610343, -0.177488], [42.610073, -0.177434], [42.609804, -0.17738], [42.609535, -0.177326], [42.609265, -0.177271], [42.608996, -0.177163], [42.608727, -0.177109], [42.608457, -0.177054], [42.608188, -0.176946], [42.607919, -0.176837], [42.607649, -0.176783], [42.60738, -0.176675], [42.607111, -0.176566], [42.606841, -0.176566], [42.606572, -0.176512], [42.606302, -0.176457], [42.606033, -0.176457], [42.605764, -0.176512], [42.605494, -0.176512], [42.605225, -0.176566], [42.604956, -0.176566], [42.60474, -0.176511], [42.604525, -0.176349], [42.604309, -0.176132], [42.604201, -0.175861], [42.604094, -0.175589], [42.603932, -0.175318], [42.603824, -0.175047], [42.603717, -0.174776], [42.603555, -0.174505], [42.603447, -0.174233], [42.60334, -0.173962], [42.603232, -0.173691], [42.603124, -0.17342], [42.603017, -0.173149], [42.602909, -0.172877], [42.602855, -0.172606], [42.602855, -0.172335], [42.602855, -0.172064], [42.602855, -0.171793], [42.602855, -0.171522], [42.602855, -0.17125], [42.602801, -0.170979], [42.602801, -0.170708], [42.602748, -0.170437], [42.602694, -0.170166], [42.60264, -0.169894], [42.602586, -0.169623], [42.602478, -0.169352], [42.602424, -0.169081]]}])

fig = go.Figure(
        go.Scattermapbox(
            mode = "markers+lines",
            marker = {'size': 20}
        ),
        layout = {
            'mapbox': {
                'center': { 'lon': 42.606, 'lat': -0.033},
                'style': "stamen-terrain",
                'zoom': 10
            },
            'margin': {'l':0, 'r':0, 'b':0, 't':0},
        }
)
fig.update_layout(
    mapbox = {
        'layers': [
            {
                'source': featureCollection,
                'sourcetype': 'geojson',
                'type': "fill", 
                'below': "traces", 
                'color': "royalblue"
            }
        ]
    }
)

fig.show()

Finally figured it out. It appears you can't use a FeatureCollection directly as the source of a mapbox layer. At least, I couldn't figure out how.

Instead, I needed to create a layer for each individual feature in the feature collection. Here is a full working example:

import geojson
import plotly.express as px
import plotly.graph_objects as go
from IPython.display import Image

def estimate_center_of_FeatureCollection(featureCollection):
    lats = [xy[1] for feature in featureCollection['features'] for xy in feature['coordinates']]
    lons = [xy[0] for feature in featureCollection['features'] for xy in feature['coordinates']]

    center_lat = (min(lats) + max(lats)) / 2
    center_lon = (min(lons) + max(lons)) / 2
    
    return center_lon, center_lat


featureCollection = geojson.FeatureCollection([{"type": "LineString", "coordinates": [[42.606938, -0.248537], [42.606992, -0.248266], [42.6071, -0.247995], [42.607207, -0.247724], [42.607315, -0.247453], [42.607477, -0.247182], [42.607692, -0.24691], [42.607908, -0.246639], [42.608177, -0.246368], [42.608447, -0.246151], [42.608716, -0.245934], [42.608986, -0.245718], [42.609255, -0.245555], [42.609524, -0.245392], [42.609794, -0.245175], [42.610063, -0.244958], [42.610333, -0.244796], [42.610602, -0.244579], [42.610871, -0.244362], [42.611141, -0.244199], [42.61141, -0.244037], [42.61168, -0.243874], [42.611949, -0.243766], [42.612218, -0.243711], [42.612488, -0.243603], [42.612757, -0.243549], [42.613026, -0.243495], [42.613296, -0.24344], [42.613565, -0.243332], [42.613835, -0.243332], [42.614104, -0.243278], [42.614373, -0.243224], [42.614643, -0.243115], [42.614912, -0.243115], [42.615182, -0.243007], [42.615451, -0.242898], [42.61572, -0.24279], [42.61599, -0.242736], [42.616259, -0.242627], [42.616528, -0.242519], [42.616798, -0.242465], [42.617067, -0.242411], [42.617337, -0.242302], [42.617606, -0.242194], [42.617875, -0.24214], [42.618145, -0.24214], [42.618414, -0.242085], [42.618684, -0.242031], [42.618953, -0.241977], [42.619222, -0.241923], [42.619492, -0.241869], [42.619761, -0.241814], [42.62003, -0.241814], [42.6203, -0.241815], [42.620569, -0.24176], [42.620839, -0.241706], [42.621108, -0.241652], [42.621377, -0.241544], [42.621647, -0.241435], [42.621916, -0.241327], [42.622186, -0.24111], [42.622455, -0.240893], [42.622724, -0.240676], [42.622886, -0.240405], [42.622994, -0.240134], [42.623048, -0.239862], [42.622994, -0.239591], [42.622832, -0.23932], [42.622725, -0.239049], [42.622348, -0.238615], [42.622348, -0.238615], [42.622132, -0.238452], [42.622132, -0.238452], [42.621647, -0.238127], [42.621378, -0.237964], [42.621109, -0.237747], [42.620839, -0.23753], [42.62057, -0.237313], [42.620301, -0.23715], [42.620031, -0.237042], [42.619762, -0.236879], [42.619493, -0.23677], [42.619223, -0.236716], [42.618954, -0.236662], [42.618684, -0.236553], [42.618415, -0.236499], [42.618146, -0.23639], [42.617876, -0.236282], [42.617445, -0.235956], [42.617445, -0.235956], [42.617284, -0.235739], [42.617284, -0.235739], [42.616961, -0.235251], [42.616853, -0.23498], [42.616638, -0.234709], [42.616422, -0.234438], [42.616261, -0.234166], [42.616099, -0.233895], [42.615883, -0.233624], [42.615668, -0.233353], [42.61556, -0.233082], [42.615453, -0.23281], [42.615399, -0.232539], [42.615399, -0.232268], [42.615453, -0.231997], [42.615453, -0.231726], [42.615453, -0.231454], [42.615453, -0.231183], [42.615399, -0.230912], [42.615345, -0.230641], [42.615291, -0.23037], [42.615238, -0.230099], [42.615184, -0.229827], [42.615184, -0.229556], [42.615184, -0.229285], [42.615184, -0.229014], [42.615184, -0.228743], [42.615184, -0.228471], [42.615184, -0.2282], [42.61513, -0.227929], [42.615076, -0.227658], [42.615023, -0.227387], [42.614969, -0.227115], [42.614915, -0.226844], [42.614915, -0.226573], [42.614915, -0.226302], [42.614915, -0.226031], [42.614915, -0.22576], [42.614915, -0.225488], [42.614915, -0.225217], [42.614915, -0.224946], [42.614915, -0.224675], [42.614915, -0.224404], [42.614915, -0.224132], [42.614915, -0.223861], [42.614969, -0.22359], [42.615023, -0.223319], [42.615077, -0.223048], [42.615185, -0.222777], [42.615293, -0.222505], [42.615347, -0.222234], [42.615454, -0.221963], [42.615562, -0.221692], [42.61567, -0.221421], [42.615778, -0.22115], [42.615939, -0.220878], [42.616047, -0.220607], [42.616209, -0.220336], [42.616317, -0.220065], [42.616478, -0.219794], [42.61664, -0.219577], [42.616856, -0.21936], [42.616856, -0.21936], [42.617233, -0.218926], [42.617341, -0.218709], [42.617394, -0.218438], [42.617448, -0.218167], [42.617502, -0.217896], [42.61761, -0.217625], [42.617772, -0.217353], [42.617933, -0.217082], [42.618095, -0.216811], [42.618203, -0.21654], [42.618311, -0.216269], [42.618365, -0.215998], [42.618418, -0.215726], [42.618419, -0.215455], [42.618419, -0.215184], [42.618419, -0.214913], [42.618419, -0.214642], [42.618365, -0.21437], [42.618311, -0.214099], [42.618257, -0.213828], [42.618149, -0.213557], [42.617988, -0.213286], [42.61788, -0.213014], [42.617719, -0.212743], [42.617557, -0.212472], [42.617395, -0.212201], [42.617288, -0.21193], [42.617126, -0.211658], [42.616965, -0.211387], [42.616803, -0.211116], [42.616641, -0.210845], [42.616426, -0.210574], [42.61621, -0.210302], [42.615995, -0.210031], [42.615726, -0.20976], [42.615456, -0.209489], [42.615187, -0.209217], [42.614972, -0.208946], [42.614756, -0.208675], [42.614541, -0.208404], [42.614325, -0.208133], [42.61411, -0.207861], [42.613894, -0.20759], [42.613733, -0.207319], [42.613571, -0.207048], [42.61341, -0.206777], [42.613302, -0.206505], [42.61314, -0.206234], [42.612925, -0.205963], [42.612709, -0.205692], [42.612494, -0.20542], [42.612225, -0.205149], [42.611955, -0.204878], [42.611686, -0.204607], [42.611417, -0.204336], [42.611147, -0.204064], [42.610878, -0.203793], [42.610609, -0.203522], [42.610339, -0.203251], [42.61007, -0.202979], [42.609801, -0.202763], [42.609531, -0.202654], [42.609262, -0.202545], [42.608993, -0.202437], [42.608723, -0.202328], [42.608454, -0.202166], [42.608185, -0.201894], [42.607969, -0.201623], [42.607754, -0.201352], [42.607592, -0.201081], [42.60743, -0.20081], [42.607323, -0.200538], [42.607215, -0.200267], [42.607161, -0.199996], [42.607053, -0.199725], [42.607, -0.199454], [42.606946, -0.199182], [42.606892, -0.198911], [42.606838, -0.19864], [42.606892, -0.198369], [42.606946, -0.198098], [42.607, -0.197827], [42.607054, -0.197555], [42.607162, -0.197284], [42.607215, -0.197013], [42.607269, -0.196742], [42.607377, -0.196471], [42.607539, -0.1962], [42.607647, -0.195928], [42.607808, -0.195657], [42.608024, -0.195386], [42.608239, -0.195115], [42.608455, -0.194844], [42.60867, -0.194573], [42.609101, -0.194085], [42.609101, -0.194085], [42.609317, -0.193868], [42.609317, -0.193868], [42.609802, -0.193434], [42.610071, -0.193271], [42.610341, -0.193054], [42.61061, -0.192837], [42.61088, -0.19262], [42.611095, -0.192404], [42.611311, -0.192132], [42.611526, -0.191861], [42.611688, -0.19159], [42.611849, -0.191319], [42.612065, -0.191048], [42.612227, -0.190777], [42.612388, -0.190505], [42.61255, -0.190234], [42.612712, -0.189963], [42.612873, -0.189692], [42.613035, -0.189421], [42.613143, -0.18915], [42.61325, -0.188878], [42.613358, -0.188607], [42.613412, -0.188336], [42.613466, -0.188065], [42.61352, -0.187794], [42.613628, -0.187523], [42.613682, -0.187251], [42.613736, -0.18698], [42.61379, -0.186709], [42.613843, -0.186438], [42.613843, -0.186167], [42.613844, -0.185896], [42.613897, -0.185624], [42.613951, -0.185353], [42.614005, -0.185082], [42.614113, -0.184811], [42.614221, -0.18454], [42.614275, -0.184269], [42.614383, -0.183997], [42.61449, -0.183726], [42.614598, -0.183455], [42.614706, -0.183184], [42.614868, -0.182913], [42.614975, -0.182642], [42.615083, -0.18237], [42.615191, -0.182099], [42.615353, -0.181828], [42.615514, -0.181557], [42.615676, -0.181286], [42.615891, -0.181015], [42.616107, -0.180743], [42.616215, -0.180472], [42.616269, -0.180201], [42.616269, -0.17993], [42.616161, -0.179659], [42.615945, -0.179387], [42.61573, -0.179116], [42.615461, -0.178845], [42.615191, -0.178574], [42.614922, -0.178357], [42.614653, -0.178194], [42.614383, -0.178086], [42.614114, -0.177977], [42.613845, -0.177923], [42.613575, -0.177814], [42.613306, -0.177706], [42.613036, -0.177597], [42.612767, -0.177543], [42.612498, -0.177489], [42.612228, -0.177489], [42.611959, -0.177489], [42.61169, -0.177489], [42.61142, -0.177489], [42.611151, -0.177489], [42.610882, -0.177489], [42.610612, -0.177488], [42.610343, -0.177488], [42.610073, -0.177434], [42.609804, -0.17738], [42.609535, -0.177326], [42.609265, -0.177271], [42.608996, -0.177163], [42.608727, -0.177109], [42.608457, -0.177054], [42.608188, -0.176946], [42.607919, -0.176837], [42.607649, -0.176783], [42.60738, -0.176675], [42.607111, -0.176566], [42.606841, -0.176566], [42.606572, -0.176512], [42.606302, -0.176457], [42.606033, -0.176457], [42.605764, -0.176512], [42.605494, -0.176512], [42.605225, -0.176566], [42.604956, -0.176566], [42.60474, -0.176511], [42.604525, -0.176349], [42.604309, -0.176132], [42.604201, -0.175861], [42.604094, -0.175589], [42.603932, -0.175318], [42.603824, -0.175047], [42.603717, -0.174776], [42.603555, -0.174505], [42.603447, -0.174233], [42.60334, -0.173962], [42.603232, -0.173691], [42.603124, -0.17342], [42.603017, -0.173149], [42.602909, -0.172877], [42.602855, -0.172606], [42.602855, -0.172335], [42.602855, -0.172064], [42.602855, -0.171793], [42.602855, -0.171522], [42.602855, -0.17125], [42.602801, -0.170979], [42.602801, -0.170708], [42.602748, -0.170437], [42.602694, -0.170166], [42.60264, -0.169894], [42.602586, -0.169623], [42.602478, -0.169352], [42.602424, -0.169081]]}])


fig = go.Figure(
    go.Scattermapbox(),
    layout = {
        'mapbox': {
            'style': "stamen-terrain",
            'zoom': 10
        },
        'margin': {'l':0, 'r':0, 'b':0, 't':0},
    }
)

fig.update_mapboxes(layers=[
    {
        'source': feature, 
        'type': "line", 
        'line': {'width': 5},
        'below': "traces", 
        'color': "royalblue"
    } for feature in featureCollection.features])

center_lon, center_lat = estimate_center_of_FeatureCollection(featureCollection)

fig.update_layout(
    mapbox = {
        'center': { 'lon':  center_lon, 'lat': center_lat}
    }
)

Image(fig.to_image(format="png", width=600, height=600))

The result is:
已渲染线串的地图

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM