How to set street obstructed in planet_osm_line/pg_route - openstreetmap

I am working on a project where we are going to be looking at finding the shortest/fastest route from point A to point B. I've been looking at the tables generated by the osm2pgsql. And I'm wondering how would I represent a road obstructed after the osm has been loaded into our database. Our project will rely on osm to map out all of the roads we will also have an operator looking at live video footage of roads. At which point if the operator see's a road is obstructed we want to update the database to reflect this road obstructed say by a downed tree.
I've been looking at all of the columns and the only one that stands out in my head is barrier. I have been unable to find any documentation on what each column represents and how pg_route takes each into consideration when creating a route. What I'm looking for is a column that when pg_route looks in the database and sees a road it says oh that roads blocked skip it?

This is good question for gis.se...
First thing is pg_routing can't route via data generated by osm2pgsql - this data is not a network. You need data generated by osm2po or osm2pgrouting and this data is quite different.
Second thing is - there is no such column. In every pg_routing function you're passing sql which will select data for route search so you're deciding which edge will be in this dataset and which not - it's not a problem to add extra column to table with edges.
Here is link to pgrouting workshop it will guide you through all process from import of data to first generated route. It's using osm2pgroutin to import data, but I suggest you use osm2po instead.

So as Jendrusk mentioned, when you generate a route you will pass the function a SQL query to select the edges for the graph you want to solve, 'select * from edges where the_geom && <bbox>' You can model blockages using point and radius, lines, or polygons that you want the route to avoid by adding to the query above avoidance zones like:
'select * from edges where the_geom && <bbox> and not st_dwithin(the_geom, point, radius) and not stdwithin(the_geom, line_or_polygon, 0.0)'
If you have lots of these avoidances then put them in a table and do a join to eliminate the edges that are used to build the graph. If the edges are not there the route is forces to find a way around the avoidance.

Related

QGIS no geom-columns found .. there is a genometry column

I have a database that keeps information for world map. When I export this to Quantum the map that is shown is not full. How can I solve that?
Sorry but your question is a little vague. What database are you using? How is the coordinates stored (can I assume decimal degrees, or are you using PostGIS and have a geometry column)? What geometry type are you trying to show?
If your DB is postgresql / postgis with a geom column, then you can select "Add Vector Layer" and check the "Database" radio button under "Source Type". You can then create a connection to that table and it will load the data just fine.
Alternatively, select the "Add PostGIS Layers" option and create a connection that way. You can follow the same steps if your database is MS Access etc and you can connect via ODBC.
If it doesn't then I think your issue will be in the database.
This part assumes you have point data:
If your database is excel, make sure your coordinate columns are the right data type and it is saved as .csv.
Select "Add Delimited Text Layer" in QGIS and you fill in the details for which are the X and Y coordinate columns. If you have a lot of columns it make things easier if your column headers are 'X' and 'Y' respectively.
Finally (again assuming point data) you could open the processing toolbox and search for 'Points Layer From Table'. If you don't see the processing button along the top of QGIS, then you've got to download it from the plugins manager (just search 'processing'). You need to state the layer, X field, Y field, and your CRS and that will create a new layer. NOTE the data is now separate from the database so any changes made to the layer are not reflected in the database. Unlike using PostGIS where the updates are live.
I hope this has helped, sorry if this has been a memory dump of all the ways I know without knowing a little more about your issue.

Overpass API way coordinates

I'm trying to query the OSM Overpass API to find any amenities within a bounding box. The actual query in my program will be generic but in my testing I noticed I cannot retrieve the coordinates(latitude, longitude) of any of the ways. Here is my script:
(
node
["amenity"="police"]
(39.235,-76.715,39.373,-76.525);
way
["amenity"="police"]
(39.235,-76.715,39.373,-76.525);
);
(._;>;);
out meta;
I need to use ways because I'm missing a significant amount of data without them. Unfortunately they do not include any coordinate data despite me adding out meta instead of the normal out. This was answered here, overpass-api ways query include coordinates about a year ago but that solution no longer works. Is this a bug? Or am I doing something wrong? I've also tried out center, out geom, and out skel to no success. I'm outputting the data in xml.
ANSWERED, I left on the recursion line on the end by accident. Thanks Tyr.

Getting Streets of a specific postcode using Open Street Maps

I want to write a code that has the Countrycode and Postcode as an input and the ouput are the streets that are in the given postcode using some apis that use GSM.
My tactic is as follows:
I need to get the relation Id of the district. For Example 1991416 is the relation id for the third district in Vienna - Austria. It's provided by the nominatim api: http://nominatim.openstreetmap.org/details.php?place_id=158947085
Put the id in this api url: http://polygons.openstreetmap.fr/get_wkt.py?id=1991416&params=0
After downloading the polygon I can put the gathered polygon in this query on the overpass api
(
way
(poly: "polygone data")
["highway"~"^(primary|secondary|tertiary|residential)$"]
["name"];
);
out geom;
And this gives me the streets of the searched district. My two problems with this solution are
1. that it takes quite a time, because asking three different APIs per request isn't that easy on ressources and
2. I don't know how to gather the relation Id from step one automatically. When I enter a Nominatim query like http:// nominatim.openstreetmap.org/search?format=json&country=austria&postalcode=1030 I just get various point in the district, but not the relation id of the searched district in order to get the desired polygone.
So my questions are if someone can tell my how I can get the relation_Id in order to do the mentioned workflow or if there is another, maybe better way to work this issue out.
Thank you for your help!
Best Regards
Daniel
You can simplify your approach quite a bit, down to a single Overpass API call, assuming you define some relevant tags to match the relation in question. In particular, you don't have to resort to using poly at all, i.e. there's no need to convert a relation to a list of lat/lon pairs. Nowadays the concept of an area can be used instead to query for certain objects in a polygon defined by a way or relation. Please check out the documentation for more details on areas.
To get the matching area for relation 1991416, I have used postal_code=1030 and boundary=administrative as filter criteria. Using that area you can then search for ways in this specific polygon:
//uncomment the following line, if you need csv output
//[out:csv(::id, ::type, name)];
//adjust area to your needs, filter critera are the same as for relations
area[postal_code=1030][boundary=administrative]->.a;
// Alternative: {{geocodeArea:name}} -> see
// http://wiki.openstreetmap.org/wiki/Overpass_turbo/Extended_Overpass_Queries
way(area.a)["highway"~"^(primary|secondary|tertiary|residential)$"]["name"];
(._;>;);out meta;
// just for checking if we're looking at the right area
rel(pivot.a);out geom;
Try it on overpass turbo link: http://overpass-turbo.eu/s/6uN
Note: not all ways/relations have a corresponding area, i.e. some area generation rules apply (see wiki page above). For your particular use case you should be ok, however.

Selecting records with a huge "where data set"

Background Info
C#
MS MVC 4
Sql Azure
Linq - Identities
Problem at hand:
Selecting records in an Items table where zip code is within a certain range of miles.
Items Table
id (PK)
Title
Body
ZipCode (Int)
Summary of Progress:
I have a class which uses the 2013 US Gazatteer zip code and tabulation areas to gather zip codes and assess distances between zip codes. It is basically a .csv/.txt file that I open into a stream and convert to POCOs in order to process distances. That much of the equation is working fine; however, selecting a list of Items from an Items table based on this list of zip codes is where I'm not sure what to do.
Scenario
User A wants to search for items within a 25 miles radius of area code 46324.
User A hits search and in the background my class returns a list of 124 zip codes within a 25 mile radius.
Question: What is the best way (performance wise) to retrieve items in my Item table using this list of zipcodes?
Possible Solutions
I thought about creating a dynamic query using the tsql in keyword within my where clause and simply supplying this list as the where parameters. This does not seem to be a very performance oriented way of doing this; however, considering my current architecture I do not see any other way.
I also thought about incorporating a sort of paging functionality that will only take the first 5 zip codes to return results followed by the next 5 and so on and so on. This will involve more work but it definitely would seem to be a better performance choice.
Any ideas?
I stumbled across your question purely by chance searching for something else, and also I see it's quite old, but I thought I'd give you a comment none the less:
What I would do in this case is actually allow the database to do the search and the C# to do the calcs. You have a class in C# which calculates the distances? Then why not save the distance from each zip code to each zip code in a "lookup table" in sql.
Doing it this way makes sure that the data is calculated once but you let the sql find the right data for you.
ie:
Create a table with from_zip, to_zip, distance fields
Calculate and populate table once at the beginning
Query by saying "select * from zip_lookup where zip_from = bla and distance between 0 and 100" or something like that

Extract data from a cube's dimension created from a View

We have imported an SQL View table into a dimension.
We already programmed a connector that talks with data cubes (MDX queries).
That said, the view we originally imported contains all the raw data we need to query.
Problem is, the MDX client requires to "select" measures only. We want to show the raw data, that means, we want to view the same columns\attributes as the initiale SQL View created.
Is this even possible ?
We know we can use Linq or whatever to talk with the SQL View Table but it will be better to talk in MDX cube-like mode to a "dumb" cube dimension's data.
Thanks.
I don't understand why you really want to use the cube and not your view, but anyway you've two solutions to extract dimension's members from a cube: through a DMV or through a standard MDX query.
The DMV named $system.MdSchema_members will return the members of your dimension. You should be able to retrieve the values you are looking for. http://msdn.microsoft.com/en-us/library/ms126046.aspx
The other solution is to create a dummy measure with a create measure statement above your MDX query. In your SQL statement, then put this dummy measure on axis 0 and all the attributes you're looking for on axis 1. This should return you a result close to the result returned by a select * from your view.