 مرحباً جميعاً، أنا محمود، رئيسي في المدينة العربية في هذه المدينة ونحن نفعل موبيليتي ديبي، نحن نفعل موضوع الدتابيس لذلك يجب أن نفعل موضوع الدتابيس في المدينة العربية في وضوع الدتابيس، نحن نفعل موضوع الدتابيس ونحن نفعل موبيليتي ديبي ونحن نفعل موضوع الدتابيس لذا، إذا كانت توجد تقلق جبيس من موبيليتي أو بعض تقلق جبيس، ونحن نفعل موضوع الدتابيس يجب أن تنقذ تطبيق الدتابيس لذلك لذلك يجب أن تأخذ بعض الموضوع الدتابيس ومن ثم تضع موضوع الدتابيس يمكنك أن تضع هذه في المدينة العربية في موضوع الدتابيس ومن ثم تضع موضوع الدتابيس في المدينة العربية يمكنك أن تتضع موضوع الدتابيس لذلك يجب أن تضع الأسفل العام بشكل جيدًا في one دتا طيب وذلك يجب أن تصدر أسفل الأسفل العام بشكل جيدًا ثم يمكنك أن تبدأ بعمل أسفل الأسفل العام بشكل جيدًا لكالقل the speed, to calculate the heading, to do selections, to do joins and so on. بشكل جيدًا فعلاً this is general architecture you are posting against SQL providing these relational types, some advanced types like XML and JSON as well and then on top you have post-jieces which provides two main abstractions, geometry لذا يمكنك يفعل مباشر وبعد ذلك تضطية في المدارس الأسلحة يضطية المدارس الأسلحة على جهاز ومدارس الأسلحة لذا تأتي لهم مدارس المدارس الأسلحة تجاهة تحركة أسلحة وتتعرف تدريبا من المنطقة على المدارس الأسلحة هنالك نظماتهم، هنالك جيوغرافية، ومتعلق ببسطة تمرأة، نظمة تمرأة، ترأة ترأة، ترأة بوليا. هذه سي are important for evaluating functions and predicates over trajectories. For example, the speed of a trajectory is changing over time. That's a temporal flow. You want to check a predicate of a trajectory is a car now inside Brussels. لذلك يجب أن تكون مجموعة للمجموعة لأنه يجب أن يكون مجموعة، ويجب أن يكون مجموعة لذلك هذه المجموعة يجب أن يكون مجموعة ويمكنك أن تظهر that the list of temporal types can be extended to support different applications right now these are the main ones supported in MobilityDB so MobilityDB is a vertical extension that extends post-grace SQL at all data management levels so it extends the data model with both time types and temporal types that I just mentioned so you can use them as attribute types in your table it extends the indexes so that one can process fairly large tables quickly so it extends the gist index of post-grace SQL which is R3 actually the SPGist that's a space partitioning so it's a kind of grid structure the B3 index it also extends the query optimizer so that one can do vacuum analysis to collect statistics about these temporal types and to be able so that the optimizer can estimate selectivity of predicates and do its optimization stuff, invoke the indexes when relevant try to find the best execution plan and then a big set of operations for example you can always project, remove the time dimension project to a line string and then do all kinds of processing on a line string if you want to include the time then you use the lifted operations we call them lifted because they lift the static operations with time so you can do arithmetic on temporal numbers can do binary operations on temporal booleans can do distance and topology operations on temporal points and so on this is all built as an extension not a fork to post-grace SQL and because it's an extension it's by default should be we hope compatible with other post-grace SQL other tools in the ecosystem of post-grace SQL we have tested with some and we wish to test with more for example integrating with PJ routing for calculating shortest distance so that to support network points you know you can represent the coordinates either absolute as latitude and longitude or as map matched like an identifier to a certain road in a road network and the fraction of distance that is traveled to get more context pipeline DB provides some stream processing of our post-grace SQL we did some let's say toy experiment on it we do support good integration with Cytus Cytus is for scalability so that you can run a post-grace SQL database on a cluster and your queries get distributed so combining both mobility DB and Cytus one can do query big data sizes so my colleague there is responsible for this part for a quick start using mobility DB there is a docker image and so on so how does it look like loading the data the most common format is comma separated you can always transfer whatever tracking format to some comma separated so most important create extension mobility DB cascade that's how to start supporting this is special temporal operations in your post-grace SQL database cascade will also create extension post-gis if it is not there because basically mobility DB does manage the temporal part and its relation to spatial part and whenever it is about spatial processing it delegates to post-gis so in this table at the left that's a pretty standard one it would use for just loading the flat information you get from the GPS device so you have longitude, latitude and time these are the key things and also some identifier for the moving object and the trip and that's the one you can do with mobility DB here you see one column called the trip which is a T geometry point this is the one that's going to carry the complete trip so every row in this table will represent a trip and in order to load this table in this table and create your trips basically you combine every point with its time stamp do whatever projection you want in order to put it in the coordinate system required create an instance of these and then aggregate all instances that are for the same trip and same car aggregate them in an array and then put this array in a temporal geometry point so now you have this complete trip in a single data item to support well you can also use other formats GTFS for public transport and there is a tutorial about this on the GitHub of mobility DB that shows step by step how to create trajectories from GTFS Google location data if you can download your own track and then start playing with it actually Google stores a lot so it will be fun you can start calculating aggregates how much time you spent in driving or you spent walking where you go if you manage to get location data of someone else that's becoming more interesting and that's also another workshop so you get a step by step tutorial a third workshop that's nice is managing AIS data this is a ship data here we use some data published from the Danish maritime authority they have huge like 3 terabytes of ship tracking data this only shows a single day after some filtering so the original file is 10 million rows and 1 gigabyte not very big but you can go bigger this is an application done by colleagues in Moscow who use MobilityDB to play with the public transport well not to play was a public transport network in Moscow and they did this nice velocity maps basically by aggregating the special temporal trajectories yeah very nice visualization if it works so this is normally yeah it will start moving so that's only yesterday had very nice meeting with our colleague from the artificial intelligence research center in Japan actually visualizing MFJSUN MFJSUN is new to appear OGC standard I know from the talk of Judy that not many are fan of OGC but it is changing OGC now is doing pretty cool stuff including standards for moving features so this data basically was exported from MobilityDB as MFJSUN imported in this cesium extension and then visualized in the moving this is one of the ships in the AIS example they even did some 3D so you can see a space time cube this is the same ship but now that's a special temporal movement so let's look more about queries in MobilityDB and what kind of operations you can get there so in this example and in the following few ones the same ship database will be used basically we have a table ships that has an identifier for a trip that has a trip trajectory as a geometry point temporal geometry point speed over ground this is a typical observation reported by the AIS sensors that tells you the speed of the ship and because it changes over time it's loaded into a temporal float so this is coming from the source information not calculated course over ground also temporal float and then I pre-calculate the special trajectory which is a line string project the same trip into some projected coordinate system the ETRS which fits the area of Denmark now if we want to list all the ships that commute between these two ports and put a garden so you have two ports and you want to see which ships commute around so I express this in this SQL query basically the two ports are represented as two rectangles and then we are interested in the trips that intersect the two rectangles together so that two predicates intersect so this predicate is a mobility DB one it accepts a trajectory a temporal geometry point and some geometry and it returns a Boolean and then in order to do this efficiently you need an R3 so you create a gist index over the projected trip cool so some gist index will be used behind the execution of this query and this is the result the two ports are the red rectangles and then these are all the ships traversing another query find the ships that have speed over ground different from the speed calculated from trajectory basically in this table you have two speed components one that is coming from the sensor SOG and one that you can calculate from the special temporal trajectory that has been constructed normally they should be the same if they are not the same then the sensor is providing some wrong information so I don't know why the query should be interesting I thought it's interesting so I try it get everything from the table ships and then perform a minus between the two speed components will convert both to kilometers per hour and then convert and this minus is a temporal minus between two temporal floats so it's going to be calculating the difference at every time instant and producing a temporal float and the time weighted average will summarize this temporal float into a single float and compares if the speed difference is greater than 10 then show me this trip so this is what I just explained you have two speed components the one calculated the blue one is the one calculated from the special temporal trajectory the orange one is the one SOG if you do a temporal minus this is what you get and then you summarize this using time weighted average to get a single float I didn't put a result here but we got some trips that really showed noise this is another query for an aggregation so here it aggregates the length of the trips per hour so basically we want to see what is the distance traveled per ships every hour so every hour in the day what is the total distance traveled by all ships as an indicator of how busy the Danish water is every hour so we create a relation of 24 periods 24 hours and for every period we restrict the trajectory to this period and then just calculate the length in kilometers of the trip and do a regular sum over these group by the period this is the total traversed distance by all the ships nothing interesting more or less it is the same all the day but the query is interesting this is a temporal aggregate so in the previous one we did a sum here that's a temporal sum and it is using the operator cumulative length cumulative length every time instant it tells how what is the distance that has been traversed so far from the beginning of the trip so the result is a temporal float and now you have multiple temporal floats per trip so you do a temporal sum which will sum these temporal floats at every time instant and the result is a temporal float that looks like this so this is a time this is a distance and you see that it is steep increasing which confirms the previous query that there's no difference according to to the hour or the time this is another trip to do a join here we want to see whether there were some dangerous situations in the dataset where two ships came very close to one another and for this predicate distance within taking two trajectories and checking whether they have ever came to 300 meters close to one another so this query is joining the self joining the ship to itself and if so for these trajectories show me the shortest line between the two trajectories so the result is something like this the blue ships and the green ships whenever a blue ship comes close to a green ship 300 meters or less we see this red line so the ones above are at the entrance of the port so that's not a big deal but maybe this one is more interesting because it happens just in the middle two ships are coming close to one another maybe one would like to further look at their direction, their speed where they heading towards one another so you can continue writing adding more complexity to the SQL this is what I mentioned in the beginning you can run this on a cluster just put on every node siteus mobilitydb post SQL the data will be sharded and replicated and then the user query you have few management commands to shard your data and to create reference tables and so on and then everything else is transparent you just write the query it gets distributed and we saw that on four machines we gain like the queries become 20 times faster so to end mobilitydb is a moving object database system it's an extension of PostSQL and PostGIS it's developed by the team in ULB it's open source it's available in github and it's compliant with the OGC standard for moving features the new development that is happening over there so yeah it doesn't show the last slide we have one minute for one question and even a short one please could you speak up a little yes and no it builds on top of the PostGIS point which can be three dimensional but I know that the distance functions in PostGIS are not very accurate when they come to third dimension so the distance is done by PostGIS mobilitydb will manage the fine thank you very much