通过图像元数据对行程作分析
利用照片及其元数据,可以通过地理计算来分析和可视化葡萄牙里斯本的一次徒步旅行.
导入并分析旅行期间拍摄的照片集.
In[1]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_26.png)
files = Map[
img \[Function] ExampleData[img, "FilePath"],
ExampleData[{"TestImageSet", "Lisbon2016"}]
];
收集一个关联中所需的所有信息.
In[2]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_27.png)
labels = {"Thumbnail", "DateTime", "GeoPosition"};
In[3]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_28.png)
dataSet = Dataset@Map[
file \[Function]
AssociationThread[
labels ->
Import[file, {labels}, IncludeMetaInformation -> False]],
files
]
Out[3]=
![](assets.zh/analyze-a-trip-by-image-metadata/O_16.png)
图示图片拍摄的位置.
In[4]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_29.png)
gps = dataSet[[All, "GeoPosition"]];
GeoGraphics[GeoMarker@gps, GeoRangePadding -> Quantity[100, "Meters"]]
Out[4]=
![](assets.zh/analyze-a-trip-by-image-metadata/O_17.png)
计算拍摄所有照片并返回所经过的步行距离.
In[5]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_30.png)
closeLoop = path \[Function] Append[path, First[path]];
In[6]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_31.png)
sortedGPS =
closeLoop@
Normal@dataSet[SortBy["DateTime"], Take[#GeoPosition, All, 2] &];
UnitConvert[
TravelDistance[sortedGPS, TravelMethod -> "Walking"], "Kilometers"]
Out[6]=
![](assets.zh/analyze-a-trip-by-image-metadata/O_18.png)
按时间顺序,将拍摄所有照片所经过的路径可视化.
In[7]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_32.png)
travel = TravelDirections[sortedGPS, TravelMethod -> "Walking"]
Out[8]=
![](assets.zh/analyze-a-trip-by-image-metadata/O_19.png)
In[9]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_33.png)
Animate[
GeoGraphics[{
Style[Normal@travel["Dataset"][1 ;; n, "Path"], Thick, Red],
dataSet[All,
GeoMarker[Take[#GeoPosition, All, 2], #Thumbnail] &]},
GeoRangePadding -> Quantity[200, "Meters"]
],
{n, 1, Length[travel["Dataset"]] + 1, 1}
]
![](assets.zh/analyze-a-trip-by-image-metadata/swf_2.png)
计算并图示本来可以使用的最短路径.
In[10]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_34.png)
optimalPath =
FindShortestTour[Normal@sortedGPS,
DistanceFunction -> (QuantityMagnitude[
TravelDistance[{#1, #2}, TravelMethod -> "Walking"],
"Kilometer"] &)]
Out[10]=
![](assets.zh/analyze-a-trip-by-image-metadata/O_20.png)
In[11]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_35.png)
Quantity[First@optimalPath, "Kilometers"]
Out[11]=
![](assets.zh/analyze-a-trip-by-image-metadata/O_21.png)
In[12]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_36.png)
shortestGPS = sortedGPS[[Last@optimalPath]];
In[13]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_37.png)
shortestTravel =
TravelDirections[shortestGPS, TravelMethod -> "Walking"]
Out[14]=
![](assets.zh/analyze-a-trip-by-image-metadata/O_22.png)
In[15]:=
![Click for copyable input](assets.zh/analyze-a-trip-by-image-metadata/In_38.png)
Animate[
GeoGraphics[{
Style[Normal@shortestTravel["Dataset"][1 ;; n, "Path"], Thick,
Blue],
dataSet[All,
GeoMarker[Take[#GeoPosition, All, 2], #Thumbnail] &]},
GeoRangePadding -> Quantity[200, "Meters"]
],
{n, 1, Length[shortestTravel["Dataset"]] + 1, 1}
]
![](assets.zh/analyze-a-trip-by-image-metadata/swf_3.png)