After importing OpenGeoDB Data into MS SQL Server, the next question is: How do we query relevant data?![]()
Especially, how do we get all cities and municipalities for a given zip code?
The OpenGeoDB database contains locations and location-related data in various tables, each of them linked by the loc_id column. The geodb_textdata table contains typed text data for a location, and the type information is stored in geodb_type_names. Browsing the type names table soon reveals which information we need to query.
Additionally, the geodb_coordinates table may contain latitude and longitude information for a loc_id, so we want to retrieve this as well if available.
The resulting query is contained in a stored procedure (you can also implement a table-valued function with the same functionality), which looks like this:
create procedure [GeoDB_GetNamesFromZip](
@zip nvarchar(10)
) as
begin
select t.loc_id as Loc_Id,
t.text_val as Name, e.text_val as Level,
c.lat as Lat, c.lon as Lon
from geodb_textdata t
left outer join geodb_textdata e
on t.loc_id = e.loc_id and e.text_type = '400200000'
left outer join geodb_coordinates c
on t.loc_id = c.loc_id
where t.loc_id in
(select loc_id from geodb_textdata
where text_val = @zip and text_type = '500300000')
and t.text_type = '500100000'
order by e.text_val desc, t.text_val
end
In the data set covering Austria, the execution of
EXEC GeoDB_GetNamesFromZip '3400'
returns the following records:
| 29569 | Kierling | 7 | 48,308 | 16,275 |
| 29602 | Klosterneuburg | 7 | 48,305 | 16,327 |
| 29634 | Kritzendorf | 7 | 48,328 | 16,303 |
| 66996 | Maria Gugging | 7 | 48,313 | 16,248 |
| 30358 | Weidling | 7 | 48,291 | 16,307 |
| 66997 | Weidlingbach | 7 | 48,2667 | 16,2533 |
| 66995 | Klosterneuburg | 6 | 48,305 | 16,327 |
