Язык Wolfram Language

Вычислительная фотография

Анализ информации о поездке по метаданным сделанных фото

Фото и их метаданные можно использовать для геолокации, визуализации и анализа пешеходной экскурсии по г. Лиссабону, Португалия.

Загрузим и проанализируем коллекцию фотографий, сделанных во время визита в Лиссабон.

In[1]:=
Click for copyable input
files = Map[ img \[Function] ExampleData[img, "FilePath"], ExampleData[{"TestImageSet", "Lisbon2016"}] ];

Соберем всю информацию о снимках.

In[2]:=
Click for copyable input
labels = {"Thumbnail", "DateTime", "GeoPosition"};
In[3]:=
Click for copyable input
dataSet = Dataset@Map[ file \[Function] AssociationThread[ labels -> Import[file, {labels}, IncludeMetaInformation -> False]], files ]
Out[3]=

Покажем на карте места, где снимки были сделаны.

In[4]:=
Click for copyable input
gps = dataSet[[All, "GeoPosition"]]; GeoGraphics[GeoMarker@gps, GeoRangePadding -> Quantity[100, "Meters"]]
Out[4]=

Рассчитаем длину пешеходного маршрута (дорога туда и обратно) по которому были сделаны снимки.

In[5]:=
Click for copyable input
closeLoop = path \[Function] Append[path, First[path]];
In[6]:=
Click for copyable input
sortedGPS = closeLoop@ Normal@dataSet[SortBy["DateTime"], Take[#GeoPosition, All, 2] &]; UnitConvert[ TravelDistance[sortedGPS, TravelMethod -> "Walking"], "Kilometers"]
Out[6]=

Построим маршрут опираясь на время, когда были сделаны фотографии.

In[7]:=
Click for copyable input
travel = TravelDirections[sortedGPS, TravelMethod -> "Walking"]
Out[8]=
In[9]:=
Click for copyable input
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} ]
Запустить анимацию
Остановить анимацию

Рассчитаем и визуализируем кратчайший путь для пешехода, который хочет посетить все места изображенные на фото.

In[10]:=
Click for copyable input
optimalPath = FindShortestTour[Normal@sortedGPS, DistanceFunction -> (QuantityMagnitude[ TravelDistance[{#1, #2}, TravelMethod -> "Walking"], "Kilometer"] &)]
Out[10]=
In[11]:=
Click for copyable input
Quantity[First@optimalPath, "Kilometers"]
Out[11]=
In[12]:=
Click for copyable input
shortestGPS = sortedGPS[[Last@optimalPath]];
In[13]:=
Click for copyable input
shortestTravel = TravelDirections[shortestGPS, TravelMethod -> "Walking"]
Out[14]=
In[15]:=
Click for copyable input
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} ]
Запустить анимацию
Остановить анимацию

Родственные примеры

de en es fr ja ko pt-br zh