Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions openpoiservice/server/api/pois_post.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,8 @@ definitions:
$ref: "#/definitions/limit"
sortby:
$ref: "#/definitions/sortby"
address:
$ref: "#/definitions/geocoder"
title: "Openpoiservice poi request"

LocationsBodyStats:
Expand Down Expand Up @@ -293,6 +295,11 @@ definitions:
enum:
- category
- distance
address:
type:
example: pelias
enum:
- pelias
bbox:
type: array
#items:
Expand Down Expand Up @@ -433,6 +440,8 @@ definitions:
osm_tags:
type: "object"
$ref: "#/definitions/location_features_properties_osm_tags"
address:
type: "json string" # "object"

location_features_properties_category_ids:
properties:
Expand Down
31 changes: 23 additions & 8 deletions openpoiservice/server/api/query_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from sqlalchemy import dialects
import geojson as geojson
import logging
import json
from timeit import default_timer as timer

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -105,7 +106,9 @@ def request_pois(self):
bbox_query.c.geom,
keys_agg,
values_agg,
categories_agg) \
categories_agg,
bbox_query.c.address
) \
.order_by(*sortby_group) \
.filter(*category_filters) \
.filter(*custom_filters) \
Expand All @@ -115,15 +118,9 @@ def request_pois(self):
.group_by(bbox_query.c.osm_id) \
.group_by(bbox_query.c.osm_type) \
.group_by(bbox_query.c.geom) \
.group_by(bbox_query.c.address)
# .all()

# end = timer()
# print(end - start)

# print(str(pois_query))
# for dude in pois_query:
# print(dude)

# response as geojson feature collection
features = self.generate_geojson_features(pois_query, params['limit'])

Expand Down Expand Up @@ -239,7 +236,13 @@ def generate_geojson_features(cls, query, limit):
geojson_features = []
lat_lngs = []

# for v in query.statement.c:
# print(v)
for v in query:
print(v)

for q_idx, q in enumerate(query):
print(q)

geometry = wkb.loads(str(q[3]), hex=True)
x = float(format(geometry.x, ".6f"))
Expand All @@ -264,12 +267,24 @@ def generate_geojson_features(cls, query, limit):
}
properties["category_ids"] = category_ids_obj

# Checks if Tags are available
if q[5][0] is not None:
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

try-except like in the array call in the following lines?

key_values = {}
for idx, key in enumerate(q[4]):
key_values[key] = q[5][idx]
properties["osm_tags"] = key_values

# Checks if addresses are available
if q[7] is not None:
#####
address_data = json.loads(q[7])
address_dict = {}
for k_add, v_add in address_data.items():
address_dict[k_add] = v_add
properties['address'] = address_dict

print(properties)

geojson_feature = geojson.Feature(geometry=trimmed_point,
properties=properties)
geojson_features.append(geojson_feature)
Expand Down
4 changes: 3 additions & 1 deletion openpoiservice/server/db_import/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ class Pois(db.Model):
uuid = db.Column(db.LargeBinary, primary_key=True)
osm_id = db.Column(db.BigInteger, nullable=False, index=True)
osm_type = db.Column(db.Integer, nullable=False)
# address = db.Column(db.Text, nullable=True)
geom = db.Column(Geography(geometry_type="POINT", srid=4326, spatial_index=True), nullable=False)

tags = db.relationship("Tags", backref='{}'.format(ops_settings['provider_parameters']['table_name']),
Expand All @@ -23,6 +22,9 @@ class Pois(db.Model):
categories = db.relationship("Categories", backref='{}'.format(ops_settings['provider_parameters']['table_name']),
lazy='dynamic')

if ops_settings['geocoder'] is not None:
address = db.Column(db.String, nullable=True)
Comment thread
isikl marked this conversation as resolved.
Outdated

def __repr__(self):
return '<osm id %r>' % self.osm_id

Expand Down
39 changes: 35 additions & 4 deletions openpoiservice/server/db_import/objects.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
# openpoiservice/server/poi_entity.py

from openpoiservice.server import ops_settings
from geopy.geocoders import * # get_geocoder_for_service
Comment thread
isikl marked this conversation as resolved.
Outdated
import json
from flask import jsonify, Response


class PoiObject(object):

def __init__(self, uuid, categories, osmid, lat_lng, osm_type):
def __init__(self, uuid, categories, osmid, lat_lng, osm_type, address=None):
self.uuid = uuid
self.osmid = int(osmid)
self.type = int(osm_type)
Expand All @@ -14,9 +19,7 @@ def __init__(self, uuid, categories, osmid, lat_lng, osm_type):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove dead code?

self.geom = 'SRID={};POINT({} {})'.format(4326, float(lat_lng[0]),
float(lat_lng[1]))

# add geocoder connector here...
self.address = None
self.address = address


class TagsObject(object):
Expand All @@ -26,3 +29,31 @@ def __init__(self, uuid, osmid, key, value):
self.osmid = int(osmid)
self.key = key
self.value = value


class AddressObject(object):

def __init__(self, lat_lng):
self.lat_lng = lat_lng[::-1]

def address_request(self):

# try:
geocoder_settings = list(ops_settings['geocoder'].items())[0]
geolocator = get_geocoder_for_service(geocoder_settings[0])
Comment thread
isikl marked this conversation as resolved.
Outdated

if list(ops_settings['geocoder'].values())[0] is not None:
Comment thread
isikl marked this conversation as resolved.
Outdated
setup_geolocator = geolocator(domain=geocoder_settings[1]['domain'],
api_key=geocoder_settings[1]['api_key'])
else:
setup_geolocator = geolocator()

response = setup_geolocator.reverse(query=self.lat_lng)
# Checks if address for location is available
if response is not None:
return json.dumps(response.raw['properties'])

# except AttributeError:
# pass


35 changes: 27 additions & 8 deletions openpoiservice/server/db_import/parse_osm.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from openpoiservice.server import db
from openpoiservice.server import categories_tools, ops_settings
from openpoiservice.server.db_import.models import Pois, Tags, Categories
from openpoiservice.server.db_import.objects import PoiObject, TagsObject
from openpoiservice.server.db_import.objects import PoiObject, TagsObject, AddressObject
from openpoiservice.server.utils.decorators import get_size
import shapely as shapely
from shapely.geometry import Point, Polygon, LineString, MultiPoint
Expand All @@ -14,6 +14,7 @@
from timeit import Timer
from bisect import bisect_left
from collections import deque
import json

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -178,13 +179,24 @@ def store_poi(self, poi_object):
:type poi_object: object
"""

######
self.pois_cnt += 1
self.poi_objects.append(Pois(
uuid=poi_object.uuid,
osm_id=poi_object.osmid,
osm_type=poi_object.type,
geom=poi_object.geom
))
# print(self.pois_cnt)
if poi_object.address is not None:
self.poi_objects.append(Pois(
uuid=poi_object.uuid,
osm_id=poi_object.osmid,
osm_type=poi_object.type,
geom=poi_object.geom,
address=poi_object.address
))
else:
self.poi_objects.append(Pois(
uuid=poi_object.uuid,
osm_id=poi_object.osmid,
osm_type=poi_object.type,
geom=poi_object.geom
))

if self.pois_cnt % 1000 == 0:
logger.info('Pois: {}, tags: {}, categories: {}'.format(self.pois_cnt, self.tags_cnt, self.categories_cnt))
Expand Down Expand Up @@ -261,7 +273,14 @@ def create_poi(self, tags, osmid, lat_lng, osm_type, categories=[]):
self.tags_object = TagsObject(my_uuid, osmid, tag, value)
self.store_tags(self.tags_object)

self.poi_object = PoiObject(my_uuid, categories, osmid, lat_lng, osm_type)
if ops_settings['geocoder'] is not None:
address = AddressObject(lat_lng).address_request()
else:
address = None

self.poi_object = PoiObject(my_uuid, categories, osmid, lat_lng, osm_type, address)
# address=poi_object.address

self.store_poi(self.poi_object)

for category in categories:
Expand Down
4 changes: 4 additions & 0 deletions openpoiservice/server/db_import/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ def parse_import(osm_file):
coords = OSMParser(concurrency=1, coords_callback=osm_importer.parse_coords_for_ways)
coords.parse(osm_file)

# Checks if geocoder is provided
if ops_settings['geocoder'] is not None:
Comment thread
isikl marked this conversation as resolved.
Outdated
logger.info('Importing addresses...')

logger.info('Storing remaining pois')
osm_importer.save_remainder()

Expand Down