Skip to content
Open
Show file tree
Hide file tree
Changes from 4 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
23 changes: 18 additions & 5 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 @@ -103,6 +104,7 @@ def request_pois(self):
bbox_query.c.osm_type,
bbox_query.c.geom.ST_Distance(type_coerce(geom, Geography)),
bbox_query.c.geom,
bbox_query.c.address.op('->')('label'),
keys_agg,
values_agg,
categories_agg) \
Expand All @@ -115,12 +117,13 @@ 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))
# print(str(pois_query))q
# for dude in pois_query:
# print(dude)

Expand Down Expand Up @@ -240,6 +243,7 @@ def generate_geojson_features(cls, query, limit):
lat_lngs = []

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 @@ -254,8 +258,15 @@ def generate_geojson_features(cls, query, limit):
distance=float(q[2])
)

if q[4] is not None:
address_data = json.loads(q[4])
address_dict = {}
for k_add, v_add in address_data.items():
address_dict[k_add] = v_add
properties['address'] = address_dict

category_ids_obj = {}
for c_id in set(q[6]):
for c_id in set(q[7]):
category_name = categories_tools.category_ids_index[c_id]['poi_name']
category_group = categories_tools.category_ids_index[c_id]['poi_group']
category_ids_obj[c_id] = {
Expand All @@ -264,12 +275,14 @@ def generate_geojson_features(cls, query, limit):
}
properties["category_ids"] = category_ids_obj

if q[5][0] is not None:
if q[6][0] is not None:
key_values = {}
for idx, key in enumerate(q[4]):
key_values[key] = q[5][idx]
for idx, key in enumerate(q[5]):
key_values[key] = q[6][idx]
properties["osm_tags"] = key_values

print(properties)

geojson_feature = geojson.Feature(geometry=trimmed_point,
properties=properties)
geojson_features.append(geojson_feature)
Expand Down
3 changes: 2 additions & 1 deletion openpoiservice/server/db_import/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from openpoiservice.server import db, ops_settings
from geoalchemy2 import Geography
from sqlalchemy.dialects.postgresql import JSONB
import logging

logger = logging.getLogger(__name__)
Expand All @@ -14,14 +15,14 @@ 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']),
lazy='dynamic')

categories = db.relationship("Categories", backref='{}'.format(ops_settings['provider_parameters']['table_name']),
lazy='dynamic')
address = db.Column(JSONB) # , nullable=True)

def __repr__(self):
return '<osm id %r>' % self.osm_id
Expand Down
35 changes: 32 additions & 3 deletions openpoiservice/server/db_import/objects.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
# openpoiservice/server/poi_entity.py

from openpoiservice.server import ops_settings
from geopy.geocoders import * # get_geocoder_for_service
import json


class PoiObject(object):

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

Copy link
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]))
self.address = address

# add geocoder connector here...
self.address = None
# self.address = AddressObject(lat_lng).address_request()


class TagsObject(object):
Expand All @@ -26,3 +30,28 @@ 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):

for geocoder, settings in ops_settings['geocoder'].items():
if geocoder == 'pelias':
domain = ops_settings['geocoder']['pelias']['domain']
api_key = ops_settings['geocoder']['pelias']['api_key']
geolocator = Pelias(domain=domain, api_key=api_key)
response = geolocator.reverse(query=self.lat_lng)
return json.dumps(response.raw['properties'])
# return json.dumps(response.raw['properties'], sort_keys=True, ensure_ascii=False)
# json_data = json.dumps(response.raw['properties'], ensure_ascii=False)
# return json.loads(json_data)
else:
geolocator = get_geocoder_for_service(geocoder)
response = geolocator().reverse(query=self.lat_lng)
return response.raw['address']
# json_data = json.dumps(response.raw['address'], sort_keys=True)
# return json.loads(json_data)
11 changes: 8 additions & 3 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 @@ -79,6 +80,7 @@ def __init__(self):
self.tags_object = None
self.poi_object = None
self.process_ways_length = None
# self.address = None

def parse_relations(self, relations):
"""
Expand Down Expand Up @@ -183,7 +185,8 @@ def store_poi(self, poi_object):
uuid=poi_object.uuid,
osm_id=poi_object.osmid,
osm_type=poi_object.type,
geom=poi_object.geom
geom=poi_object.geom,
address=poi_object.address
))

if self.pois_cnt % 1000 == 0:
Expand Down Expand Up @@ -261,7 +264,9 @@ 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)
address = AddressObject(lat_lng).address_request() # json.dumps()

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

for category in categories:
Expand Down