Coder Social home page Coder Social logo

opener-next / openstop Goto Github PK

View Code? Open in Web Editor NEW
71.0 3.0 13.0 121.2 MB

App for collecting OpenStreetMap-compliant accessibility data in public transport

Home Page: https://openstop.app

License: GNU General Public License v3.0

Kotlin 0.03% Swift 0.07% Objective-C 0.01% Dart 99.20% Ruby 0.28% HTML 0.42%
accessibility osm openstreetmap public-transport flutter

openstop's Introduction

OpenStop

The goal of this app is to collect accessibility data for public transport stops in OpenStreetMap so that everyone can benefit from it. Due to the huge amount of public transport stops out there we want to encourage all citizen (experienced OSM users and newcomers) to help gathering this data. That's why we are developing this app that allows collecting the data in an easy, accessible and safe manner by asking simple questions. For deeper insight read the working principle of the app.

The data shall be the foundation for better routing especially for impaired people and lead to a renovation of non accessible stops, as well as many other things we ourselves can't even imagine right now.

Thanks and happy mapping!

Download

Get it on Google Play Download on the App Store Get it on F-Droid

Screenshots

Screenshot with map overview Screenshot with visualized POI Screenshot with multiple choice question dialog Screenshot with bool question dialog and extended info box Screenshot with summary and upload dialog

Contributing

We are always happy, if you not only want to help us mapping, but also want to directly participate in the project.

You can either open issues for enhancement suggestions and bug reports or help us developing the app further. A good starting point for the latter is to read the build instructions for the app.

You can also help translating the app at Weblate.

License

This app is released under the terms of the GNU General Public License v3.0 or later (GPL-3.0-or-later).

Funding

Logo of the German Federal Ministry of Digital Affairs and Transport Logo of the mFUND innovation initiative

OpenStop is developed in the project OPENER next, which is funded by the German Federal Ministry for Digital and Transport as part of the mFUND innovation initiative.

Acknowledgement

Special thanks to Andy Allan (@gravitystorm) for granting us free access to the beautiful Thunderforest map tiles.

openstop's People

Contributors

7h30n3 avatar a-andre avatar floedelmann avatar habi avatar henry00572 avatar janikkaden avatar le-jun avatar robbendebiene avatar weblate avatar wielandb avatar yulieth9109 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

openstop's Issues

Create About Page

Create a page where the project, the participants, funding and developer are mentioned.

Create Settings Page

Create a settings page accessible via the burger menu / drawer.

  • Difficulty Level
  • Theme Selector

Show Map Markers for Ways and Areas

  • Implement Center Point Calculation
  • Highlight selected Way/ Area
  • The retrieved data for relations can be incomplete. It misses ways and nodes that are necessary to build the multipolygon because they lie outside of the queried bounding box.
  • Revisit center point calculation for Polygons

Load stops from OSM server

Load all in the current viewport visible stops from OSM database into internal data structure. Extend the viewport box to pre load nearby but currently invisible stops.

Store the extended viewport (bounding box). If the user leaves this bounding box create a new one from the current viewport and load all stops in this bbox from the server.

This depends on the OSMAPI wrapper which is worked out in a separate repository.

Stops should be displayed with a distinct name for example by train station and platform or bus number and direction

Depends on: #4

Location determination just works with Google?

The problem

The app has the location permission and my location sharing is on but it doesn't work inside the app. A screen appeared that I should active the location services by Google (see Screenshot). If I clicked on "Nein Danke/No Thanks" nothing happened. And I won't to activate these Google services. I have no problems with this in other apps like OsmAnd.

Which app version do you use?

0.1.0+1

What operating system do you use?

Android

What operating system version do you use?

8.1.0

Additional information

Screenshot_2022-05-06_12-21-22

Restore given answers

Save answers of closed but un-uploaded question sheets while the app is running.

Reason:
The user may give some answers and either accidentally close the question sheet or switch to another element with the intend to continue later. In both cases the given answers are lost.

Implementation notes:

  • The overall code should be ready for this change, with the exception to the duration picker that needs to "scroll" to the value provided by the answer controller.
  • This will mainly involve changing the questionnaire provider to be able to provide and store multiple questionnaires by element.

Solve overlapping markers

We probably want to display a shrank version (small dot) for markers that do not have enough surrounding space and would therefore overlap other markers. Also the layering order in which markers are display should be based on their LatLng position so that markers closer to the bottom of the screen lie above markers closer to the top.

Problem:
grafik

Integrate OSM User Accounts

A page where users can login with their OSM account in order to link their edits/changesets to their accounts.
This is accessible via the burger menu/ drawer.

  • Integrate Registration Page
  • Create Login/ Logout Dialog
  • OAuth Integration
  • Show account name and profile image in drawer

Switch to darkmode hasn't an effect on location button

The problem

After switching to darkmode and vice versa, the location button is still colored with the old theme. After restarting the app, it works. The location sharing has to be off for that (not in red color)

Which app version do you use?

0.1.0+1

What operating system do you use?

Android

What operating system version do you use?

8.1.0

Additional information

Screenshot_2022-05-06_12-39-27

Map Layer Switcher Entries disappear on Theme Change

The problem

  1. Click on Map Layer Switcher on the buttom left corner of the home screen (map view) so the entries extend.
  2. Go to Settings and change the theme.
  3. Go back to the home screen

You can see the Map Layer Switcher is still extended (Icon shows crossed layers) but the actual entries are missing.
However, they appear as soon as you move the map (or click the location button)
Screenshot_1654251066

Which app version do you use?

0.1.2+3

What operating system do you use?

Android

What operating system version do you use?

12

Additional information

No response

Toggling expert questions has no effect on answered normal questions

The problem

Steps for reproduce:

  1. Answered all "normal" questions in an area
  2. Restart app
  3. Click in an area to load all questions -> no markers appeared (that's right)
  4. Toggle the expert questions
  5. Click in this area again -> no load indicator -> no new markers appear.

Which app version do you use?

0.1.0+1

What operating system do you use?

Android

What operating system version do you use?

8.1.0

Additional information

No response

Add check_date to attributes

The request

It would be great, to add the check_date attribute on every node with every change. Since many platforms/stops are currently rebuilt, the attribute would probably be preferred as a prefix to indicate more precisely which attribute was checked at what time. Not always is the changing date the check_date as well, e.g. if the source is an older image or from Mapillary or KartaView.

E.g. check_date:passenger_information_display = 2022-05-08

Which app version do you use?

0.1.0.+1

What operating system do you use?

Android

What operating system version do you use?

8.1.0

Additional information

No response

Add main map page

Add a page which shows a slippy map. This will be shown on app launch (and after the onboarding pages).
The map view is expanded over the entire screen with some floating action buttons like a burger menu and zoom buttons.

Reference: StreetComplete
Implementation details: Stacked widget to overlay multiple elements. First layer contains the map view and second layer contains floating action buttons.

packages:
Pixel tiles: https://pub.dev/packages/flutter_map
Vector tiles: https://pub.dev/packages/mapbox_gl

Pixel tiles will be easier to setup, and we will also be able to support desktop devices.
Vector tiles on the other hand are smaller in size, allow flexible rendering and provide an overall more modern look and feel

Create Theme for the App

Creating an app theme to globally define the look of the app and to get a consistent user experience.

To share a Theme across the entire app, we have to provide ThemeData to the MaterialApp constructor.

Upload changes manually

The problem

I want to upload the changes that I made manually because otherwise it is easy for other people to track my location.

Which app version do you use?

0.1.0+1

What operating system do you use?

Android

What operating system version do you use?

No response

Additional information

No response

Create Ability to add new OSM Elements

For accessible routing it is important to know where e.g. people with wheel chairs can cross the street. Thus objects like curb lowerings should be mapped.

Discuss if they should be mapped as ways or POIs (similar to a door).
Explore possible techniques such as drawing on the map or tracking via GPS.

Reference App: https://vespucci.io/ and OSM Contributor

Rework question additional info display

Currently the question description can only show the description, which will unfold itself below the question text.
However we planned to also allow showing multiple images in addition to the description.

Since we can most likely not fit the images below the question text we need to come up with a different design for showing the additional info of a question. The most straight forward one would be showing the info in a popup.

Show stops/icons on map

Display custom icons on the map. Each icon has a final/fixed position and probably some sort of state like "complete", "partial", "untouched". This state is computed by the amount of completed attributes and somehow visualized (change of icon, change of color, ..).

Reference: StreetComplete
Implementation details: The icon rendering and positioning should be handled by the map view library/framework.

Hide or check a marker when it is finished

The problem

If I answered all questions, the marker is still there. It looks like I can answer more question and the marker is clickable but it is not the case. After restart the app, the marker is gone.

Which app version do you use?

0.1.0+1

What operating system do you use?

Android

What operating system version do you use?

8.1.0

Additional information

No response

Create Question Panel UI

Implement a user interface based on the provided attribute data structure.

  • Step by step list to keep the UI simple and prevent it from being too overwhelming

  • For every main hierarchical attribute create one page/step.

  • Implement Navigation Bar:

    • Indicate how many steps are left and where the user currently is
    • Allow going back to previous steps/attributes

Depends on #11

Usability Design Guidelines: https://www.nngroup.com/articles/ten-usability-heuristics/

UI elements to implement:

  • Bool
  • List
  • Number
  • String
  • Duration
  • Opening Hours
  • Navigation Bar
  • List with Multiple Choice

Selecting a marker zooms in too close

Device: Honor View 20
OS: Android 10
App version: 5d71b14

Issue (How to reproduce):
After clicking on a stop area click on a marker and the camera zooms in too far, so the surrounding is nearly visible anymore.

Expected behavior:
Don't zoom too close to the marker. See attached screenshots. Left/First as is. Right/Second as expected.

First Second

Create Map Marker Widget

Create map marker widget with icons to be easily distinguishable for users.

  • Implement icon set suitable for OSM elements
  • Show map maker with icon according to OSM tag

Ability to take and upload photos

Allow users to take and assign photos to stops.

This has several use cases:

  • Photos serve as an additional and objective data source
  • People with impairments can pre-examine a stop to detect if it is accessible for their particular impairment
  • Tagging stops later on
  • Allow others to tag stops
  • Validation
  • Allow training of an AI for potential auto tagging or validation

Upload images to a separate server and potentially link their image urls to specific OSM elements or create notes for missing elements linking to the image.

The most common services are Mapillary and KartView

Comparison:

  • KartView allows logging in with an existing OSM account
  • KartView is nearly completely open source while Mapillary is acquired by Facebook and only open sources some parts
  • KartView is not very actively maintained
  • Less data and sophisticated than Mapillary (from my subjective analysis)

Changing theme apparently resets question state

The problem

When selecting an answer and then switching the theme (from light to dark) the text of the "next" button changes from "Weiter" (next) to "Überspringen" (skip) although the answer is still selected.

Which app version do you use?

c3b0b26

What operating system do you use?

Android

What operating system version do you use?

10

Additional information

light
screen8

F-Droid Link in the Readme.md is 404

Hi,

when I follow the link to check the App on F-Droid I only get a 404 page. Is the App available on F-Droid and could you provide a link or fix the existing one?

Regards

Max

Improve error message for input type "number"

Device: Honor View 20
OS: Android 10
App version: 5d71b14

Issue (How to reproduce):
If you type a number in a form field, which is out of the expected range (as it can be seen in the screenshot), the error message doesn't respect the amount of allowed decimal places. Also, if the maximum allowed number isn't set, it is displayed in the error message as "Infinity".

Expected behavior:
The expected error message (in this case) should be something like: "Wert muss größer sein als 1".

Screenshot with visualized stop areas

Thanks @rebeccasc for the hint.

Style app

For visually impaired users or when app is used at night.

Make use of the system-wide setting for dark mode.
The high contrast theme should also be automatically activated if the user enabled this as a system-wide setting.

Use a barebone theme defining sizes etc. and let copies of that handle colors for light and dark theme

  • Create light theme
  • Create dark theme
  • Create high contrast theme
  • Create graphics (e.g. for onboarding screen)

Indicate that the upload is in progress

Currently after clicking the "upload button" nothing will happen until the upload is completed. While this works quite well when having a good connection, uploading data with a slow connection may take longer. Thus we should show some kind of indeterminate progress indicator.

Ideas:

  • Animate the arrow of the upload button icon, or the entire icon
  • Animate the progress bar (behind the upload button)

Example:

Create Onboarding Page

  • Add an introduction page that is only shown on first launch of the app. Explain the purpose of this app and the user's task.
  • Another page should be dedicated to accept the terms of use / privacy notes.
  • The copyright (public domain) of the collected data should be made clear.

Reference: StreetComplete

After restart, back in Chemnitz (without enabled location)

The problem

If I answered questions in my town and restart the app, I'm always back in Chemnitz instead of the last map view.

Steps to reproduce:

  1. Disable location permission in settings
  2. Open app
  3. Deny the location request
  4. Move the map view
  5. (opt.) Answer questions
  6. Close the app completely
  7. Restart the app
  8. -> Again in Chemnitz

Which app version do you use?

0.1.0.+1

What operating system do you use?

Android

What operating system version do you use?

8.1.0

Additional information

No response

Implement image viewer dialog/popup for images

This is about implementing a viewer for especially tiny images so they can be viewed enlarged.
Ideally we also allow zooming in, which can be easily done with wrapping it in the following widget: https://api.flutter.dev/flutter/widgets/InteractiveViewer-class.html

It would be nice to have this as a separated widget that could be wrapped around an image widget where needed. By default it will just show the image but on tap will display the popup.

Affected Widgets

ListInput, QuestionTextHeader

Open question

How to trigger the viewer? On tap, on hold? On Tap is more discoverable but has the drawback that it interfers with the ListInput

Example draft

image

Location marker gets stuck when initially selecting a stop area

Device: iPhone Simulator
OS: iOS 15.2
App version: 0812738

Issue (How to reproduce):
When you open the app and click on a stop area, which is a little further away from your current position the location marker gets stuck and doesn't disappear although the current position is outside the current viewport.
If you move the viewport back to your current position everything is fine and the location marker won't get stuck again.

Expected behavior:
If the location marker is outside the viewport it should disappear.

Simulator.Screen.Recording.-.iPhone.13.-.2022-02-16.at.10.10.17_1.mp4

.

Create hierarchical DELFI attribute data structure

The goal of this data structure is to easily allow the addition/removal of new attributes and its corresponding information. The UI should be generated from this dataset.

Every attribute should contain things like:

  • DELFI id
  • Name and description/question.
  • The corresponding OSM tag
  • Allowed values and value type
  • Values contain optionally a list of child attributes that will be shown if the particular value is selected (attributes are referenced via DEFLI id)
  • The order of the values describes the usage of the value (high usage means low index)

In question:

  • Always provide a value selection but also always allow custom values?

Example JSON data structure

{
  id: 2,
  name: "Bahnsteig Typ",
  details: "",
  tag: "amenity",
  values: [
   {
     value: "1",
     name: "item 1",
     image: "nameoftheimage.svg",
     details: "some further details that describe this attribute",
     children: [3, 5]
   },
   {
     value: "2",
     name: "item 2",
     image: "nameoftheimage2.svg",
     details: "some further details that describe this attribute"
   },
   ...
  ]
}

Exception when clicking outside of an already selected stop area

The problem

  1. Click on a red stop area (and let it load all markers)
  2. Click outside the previously selected stop area (not another stop area)
  3. Get the following error:
E/flutter (11710): [ERROR:flutter/shell/common/shell.cc(93)] Dart Unhandled Exception: Null check operator used on a null value, stack trace: #0      QuestionnaireProvider._updateQuestionnaireAnswer (package:open_stop/view_models/questionnaire_provider.dart:170:75)
E/flutter (11710): #1      QuestionnaireProvider.close (package:open_stop/view_models/questionnaire_provider.dart:97:5)
E/flutter (11710): #2      _HomeScreenContentState._onMapTap (package:open_stop/screens/home.dart:427:43)
E/flutter (11710): #3      MapGestureMixin.handleTap (package:flutter_map/src/gestures/gestures.dart:578:21)
E/flutter (11710): #4      _TapPositionDetectorState._postCallback (package:positioned_tap_detector_2/positioned_tap_detector_2.dart:131:15)
E/flutter (11710): #5      _TapPositionDetectorState._onTimeout (package:positioned_tap_detector_2/positioned_tap_detector_2.dart:74:7)
E/flutter (11710): #6      _invokeErrorHandler (dart:async/async_error.dart:45:24)
E/flutter (11710): #7      _HandleErrorStream._handleError (dart:async/stream_pipe.dart:269:9)
E/flutter (11710): #8      _ForwardingStreamSubscription._handleError (dart:async/stream_pipe.dart:157:13)
E/flutter (11710): #9      _RootZone.runBinaryGuarded (dart:async/zone.dart:1630:10)
E/flutter (11710): #10     _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:360:15)
E/flutter (11710): #11     _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:378:7)
E/flutter (11710): #12     _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:280:7)
E/flutter (11710): #13     _SyncStreamControllerDispatch._sendError (dart:async/stream_controller.dart:778:19)
E/flutter (11710): #14     _StreamController._addError (dart:async/stream_controller.dart:656:7)
E/flutter (11710): #15     _StreamController.addError (dart:async/stream_controller.dart:610:5)
E/flutter (11710): #16     Stream.timeout.<anonymous closure> (dart:async/stream.dart:1879:20)
E/flutter (11710): #17     Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
E/flutter (11710): #18     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:398:19)
E/flutter (11710): #19     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:429:5)
E/flutter (11710): #20     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)

Which app version do you use?

0.2.0

What operating system do you use?

Android

What operating system version do you use?

12

Additional information

No response

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.