Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6 Лаб6_Streams-SPL.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.43 Mб
Скачать

6.Создание нового проекта

На экране должна открыться информация о среде разработки – InfoSphere Streams Studio.

    1. Выберите в меню File -> New -> Project... В открывшемся списке выберите SPL Application Project и нажмите Next >

Рис.24 – Создание проекта

    1. Введите следующие параметры проекта:

Project name: LabGeospatial

Namespace: lab.geospatial

Main composite: LabGeospatial

Нажмите Next>

Рис.25 – Создание проекта

    1. Обратите внимание на то, что к проекту подключен набор инструментов com.ibm.streams.geospatial, необходимый для работы с геоданными. Нажмите Finish.

Рис. 26 – Создание проекта

7.Разработка приложения

В диалоговом окне (рис. 27) должен был открыться файл LabGeospatial.spl в режиме графического редактирования. Поскольку в данной лабораторной работе мы будем разрабатывать приложение, используя специализированный язык обработки потоковых данных – SPL, поэтому необходимо переключиться в режим редактирования SPL кода.

    1. Чтобы открыть файл для редактирования в режиме SPL кода кликните правой клавишей мыши в любое пустое место редактора и выберите пункт Open with SPL Editor.

Рис.27 – Разработка приложения

    1. Импортируйте инструменты для работы с геоданными в проект. Для этого после установки пространства имен (namespace) введите текст:

use com.ibm.streams.geospatial.twodimension.geometry::*;

Рис.28 – SPL код приложения

Строка 3 – composite LabGeospatial { … } – описывает сложный (составной) оператор.

    1. Опишите типы данных, которые понадобятся в данном приложении:

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 – Типы данных

    1. Теперь необходимо сообщить программе о том, что начинается описание схемы потоковых данных, для этого напишите в 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 считывает из файла первую строку с данными, отправляет ее на дальнейшую обработку другому оператору, и только после окончания обработки первой строки считывает из файла следующую, снова отправляет ее на обработку и т.д.

    1. Создайте в проекте файл с данными о фиксированном местоположении интересующих объектов. Для этого в Project Explorer раскройте ваш проект (LabGeospatial), перейдите в Resources -> data. Кликните правой клавишей по каталогу data и выберите New -> File

Рис.30 – Создание нового файла в проекте

    1. Введите имя файла: fixed.txt и нажмите Finish.

Рис.31 – Создание нового файла в проекте

    1. Созданный файл откроется для редактирования. Введите в него следующие данные об объектах (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

    1. Создайте поток для чтения данных из файла о фиксированном местоположении интересующих объектов.

(stream<FixedCoordT> FixedCoordinates) as LocationReader = FileSource()

{

param

file: "fixed.txt";

format: csv;

}

    1. Создайте поток для преобразования данных о местоположении автомобилей.

(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, время, широта, долгота, скорость движения, направление движения). Поскольку для определения, находится ли автомобиль в зоне заданного радиуса интересующих нас фиксированных объектов, нам нужны не все эти данные, то на выход оператор передает широту и долготу местоположения автомобиля.

    1. Создайте поток для преобразования данных о фиксированных объектах

(stream<FixedLocT> FixedLocations as O) as FixedTransformer

= Functor(FixedCoordinates)

{

output O: center = createPoint128(latitude, longitude);

}

    1. Создайте поток для объединения обработанных данных о местоположении автомобиля и фиксированного объекта с целью определения, находится ли автомобиль в заданном радиусе от объекта.

(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);

}

    1. В заключение добавьте оператор записи результатных данных в файл:

() as NearbyVehicleWriter = FileSink(NearbyVehicles)

{

param

file : "/home/<имя_пользователя>/workspace/LabGeospatial/data/nearcars.txt";

format: csv;

quoteStrings: false;

}

В параметре file не забудьте заменить <имя_пользователя>!

В начале первой строки этого кода пустые скобки “()” говорят о том, что оператор FileSink не создает поток данных.

В результате ваш SPL код должен выглядеть следующим образом:

Рис.33 – SPL-код разработанного приложения

В графическом виде ваше приложение выглядит следующим образом:

Рис.34 – Графическая схема разработанного приложения

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]