6.Создание нового проекта
На экране должна открыться информация о среде разработки – InfoSphere Streams Studio.
Выберите в меню File -> New -> Project... В открывшемся списке выберите SPL Application Project и нажмите Next >
Рис.24 – Создание проекта
Введите следующие параметры проекта:
Project name: LabGeospatial
Namespace: lab.geospatial
Main composite: LabGeospatial
Нажмите Next>
Рис.25 – Создание проекта
Обратите внимание на то, что к проекту подключен набор инструментов com.ibm.streams.geospatial, необходимый для работы с геоданными. Нажмите Finish.
Рис. 26 – Создание проекта
7.Разработка приложения
В диалоговом окне (рис. 27) должен был открыться файл LabGeospatial.spl в режиме графического редактирования. Поскольку в данной лабораторной работе мы будем разрабатывать приложение, используя специализированный язык обработки потоковых данных – SPL, поэтому необходимо переключиться в режим редактирования SPL кода.
Чтобы открыть файл для редактирования в режиме SPL кода кликните правой клавишей мыши в любое пустое место редактора и выберите пункт Open with SPL Editor.
Рис.27 – Разработка приложения
Импортируйте инструменты для работы с геоданными в проект. Для этого после установки пространства имен (namespace) введите текст:
use com.ibm.streams.geospatial.twodimension.geometry::*;
Рис.28 – SPL код приложения
Строка 3 – composite LabGeospatial { … } – описывает сложный (составной) оператор.
Опишите типы данных, которые понадобятся в данном приложении:
-
type
PointT = PointPropertyType.point128;
FixedCoordT = rstring id, float64 latitude, float64 longitude, float64 radius;
FixedLocT = rstring id, PointT center, float64 radius;
LocationType = rstring id, rstring time, float64 latitude,
float64 longitude, float64 speed, float64 heading ;
Рис.29 – Типы данных
Теперь необходимо сообщить программе о том, что начинается описание схемы потоковых данных, для этого напишите в SPL коде – “graph”. Создайте поток, который будет считывать из файла данные о местоположении каждого автомобиля с помощью оператора FileSource и отправлять на дальнейшую обработку кортеж данных типа LocationType, заданного нами ранее.
-
graph
(stream<LocationType> Vehicles) as VehiclesReader = FileSource()
{
param
file: "/bootcamp/lab06_Streams/all.cars";
format: csv;
}
Данный SPL код вызывает оператор FileSource, который создает поток VehiclesReader. Кортеж данных потока VehiclesReader содержит один атрибут – Vehicles с типом данных LocationType (описанный нами ранее).
В параметрах оператора установлен путь к файлу с исходными данными: /bootcamp/lab06_Streams/all.cars, и формат файла: csv (Comma-Separated Values – Значения, разделенные запятыми)
Таким образом, оператор FileSource считывает из файла первую строку с данными, отправляет ее на дальнейшую обработку другому оператору, и только после окончания обработки первой строки считывает из файла следующую, снова отправляет ее на обработку и т.д.
Создайте в проекте файл с данными о фиксированном местоположении интересующих объектов. Для этого в Project Explorer раскройте ваш проект (LabGeospatial), перейдите в Resources -> data. Кликните правой клавишей по каталогу data и выберите New -> File
Рис.30 – Создание нового файла в проекте
Введите имя файла: fixed.txt и нажмите Finish.
Рис.31 – Создание нового файла в проекте
Созданный файл откроется для редактирования. Введите в него следующие данные об объектах (ID объекта, широта, долгота, радиус поиска автомобилей):
-
loc1,37.786216,-122.409074,500
loc2,37.791134,-122.398774,250
loc3,37.787776,-122.40122,300
Нажмите Ctrl+S для сохранения файла и вернитесь к редактированию файла LabGeospatial.spl (выберите соответствующую вкладку)
Рис.32 – Открытые вкладки в Streams
Создайте поток для чтения данных из файла о фиксированном местоположении интересующих объектов.
-
(stream<FixedCoordT> FixedCoordinates) as LocationReader = FileSource()
{
param
file: "fixed.txt";
format: csv;
}
Создайте поток для преобразования данных о местоположении автомобилей.
-
(stream<LocationType, tuple<PointT location>> VehicleLocations as O)
as VehicleTransformer = Functor(Vehicles)
{
output O: location = createPoint128(latitude,longitude);
}
В этом коде “Functor(Vehicles)” говорит о том, что вызывается оператор Functor и принимает для обработки данные с атрибутом Vehicles (которые в потоке VehiclesReader создает оператор FileSource, описанный нами ранее).
Данный оператор – Functor – настроен таким образом, что на входе получает данные об автомобиле (ID, время, широта, долгота, скорость движения, направление движения). Поскольку для определения, находится ли автомобиль в зоне заданного радиуса интересующих нас фиксированных объектов, нам нужны не все эти данные, то на выход оператор передает широту и долготу местоположения автомобиля.
Создайте поток для преобразования данных о фиксированных объектах
-
(stream<FixedLocT> FixedLocations as O) as FixedTransformer
= Functor(FixedCoordinates)
{
output O: center = createPoint128(latitude, longitude);
}
Создайте поток для объединения обработанных данных о местоположении автомобиля и фиксированного объекта с целью определения, находится ли автомобиль в заданном радиусе от объекта.
-
(stream<LocationType,tuple<rstring fixedLocId, float64 distance>> NearbyVehicles
as O) as SpatialJoiner = Join(VehicleLocations as V ; FixedLocations as F)
{
window
V: sliding, count(0) ;
F: sliding, count(3) ;
param
match: distanceHaversine(V.location, F.center) < F.radius;
output O:
fixedLocId = F.id,
distance = distanceHaversine(V.location, F.center);
}
В заключение добавьте оператор записи результатных данных в файл:
-
() as NearbyVehicleWriter = FileSink(NearbyVehicles)
{
param
file : "/home/<имя_пользователя>/workspace/LabGeospatial/data/nearcars.txt";
format: csv;
quoteStrings: false;
}
В параметре file не забудьте заменить <имя_пользователя>!
В начале первой строки этого кода пустые скобки “()” говорят о том, что оператор FileSink не создает поток данных.
В результате ваш SPL код должен выглядеть следующим образом:
Рис.33 – SPL-код разработанного приложения
В графическом виде ваше приложение выглядит следующим образом:
Рис.34 – Графическая схема разработанного приложения
