example showing use of PostGIS data
This commit is contained in:
		
							parent
							
								
									13c9e1ed58
								
							
						
					
					
						commit
						aa0927911d
					
				
							
								
								
									
										82
									
								
								profiles/examples/postgis.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								profiles/examples/postgis.lua
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,82 @@ | |||||||
|  | 
 | ||||||
|  | -- This example shows how to query external data stored in PostGIS when processing ways. | ||||||
|  | 
 | ||||||
|  | -- This profile assumes that OSM data has been imported to PostGIS using imposm to a db | ||||||
|  | -- with the name 'imposm', the default user and no password. It assumes  areas with | ||||||
|  | -- landusage=* was imported to the table osm_landusages, containting the columns type and area. | ||||||
|  | -- Seee http://imposm.org/ for more info on imposm. | ||||||
|  | -- Other tools for importing OSM data to PostGIS include osm2pgsql and osmosis. | ||||||
|  | 
 | ||||||
|  | -- It uses the PostGIS function ST_DWithin() to find areas tagged with landuse=industrial | ||||||
|  | -- that are within 100 meters of the way. | ||||||
|  | -- It then slows down the routing depending on the number and size of the industrial area. | ||||||
|  | 
 | ||||||
|  | -- The end result is that routes will tend to avoid industrial area. Passing through | ||||||
|  | -- industrial areas is still possible, it's just slower, and thus avoided if a reasonable | ||||||
|  | -- alternative is found. | ||||||
|  | 
 | ||||||
|  | -- We use the osm id as the key when querying PostGIS. Be sure to add an index to the colunn | ||||||
|  | -- containing the osm id (osm_id in this case), otherwise you will suffer form very | ||||||
|  | -- bad performance. You should also have spatial indexes on the relevant gemoetry columns. | ||||||
|  | 
 | ||||||
|  | -- More info about using SQL form LUA can be found at http://www.keplerproject.org/luasql/ | ||||||
|  | 
 | ||||||
|  | -- Happy routing! | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | -- Open PostGIS connection | ||||||
|  | lua_sql = require "luasql.postgres"           -- we will connect to a postgresql database | ||||||
|  | sql_env = assert( lua_sql.postgres() ) | ||||||
|  | sql_con = assert( sql_env:connect("imposm") ) -- you can add db user/password here if needed | ||||||
|  | print("PostGIS connection opened") | ||||||
|  | 
 | ||||||
|  | -- these settings are read directly by osrm | ||||||
|  | take_minimum_of_speeds 	= true | ||||||
|  | obey_oneway 			      = true | ||||||
|  | obey_bollards 			    = true | ||||||
|  | use_restrictions 		    = true | ||||||
|  | ignore_areas 			      = true	-- future feature | ||||||
|  | traffic_signal_penalty 	= 7		  -- seconds | ||||||
|  | u_turn_penalty 			    = 20 | ||||||
|  | 
 | ||||||
|  | -- nodes processing, called from OSRM | ||||||
|  | function node_function(node) | ||||||
|  |   return 1 | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | -- ways processing, called from OSRM | ||||||
|  | function way_function (way) | ||||||
|  |   -- only route on ways with highway=* | ||||||
|  | 	local highway = way.tags:Find("highway") | ||||||
|  | 	if (not highway or highway=='') then | ||||||
|  | 	  return 0 | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  | 	-- Query PostGIS for industrial areas close to the way, then groups by way and sums the areas. | ||||||
|  |   -- We take the square root of the area to get a estimate of the length of the side of the area,  | ||||||
|  |   -- and thus a rough guess of how far we might be travelling along the area.  | ||||||
|  | 	 | ||||||
|  | 	local sql_query = " " .. | ||||||
|  |     "SELECT SUM(SQRT(area.area)) AS val " .. | ||||||
|  |     "FROM osm_ways way " .. | ||||||
|  |     "LEFT JOIN osm_landusages area ON ST_DWithin(way.geometry, area.geometry, 100) " .. | ||||||
|  |     "WHERE area.type IN ('industrial') AND way.osm_id=" .. way.id .. " " .. | ||||||
|  |     "GROUP BY way.id" | ||||||
|  |    | ||||||
|  |   local cursor = assert( sql_con:execute(sql_query) )   -- execute querty | ||||||
|  |   local row = cursor:fetch( {}, "a" )                   -- fetch first (and only) row | ||||||
|  |   way.speed = 20.0                                      -- default speed | ||||||
|  |   if row then | ||||||
|  |     local val = tonumber(row.val)                       -- read 'val' from row  | ||||||
|  |     if val > 10 then | ||||||
|  |       way.speed = way.speed / math.log10( val )         -- reduce speed by amount of industry close by  | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |   cursor:close()                                        -- done with this query | ||||||
|  |    | ||||||
|  |   -- set other required info for this way | ||||||
|  |  	way.name = way.tags:Find("name") | ||||||
|  | 	way.direction = Way.bidirectional  | ||||||
|  | 	way.type = 1 | ||||||
|  | 	return 1 | ||||||
|  | end | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user