Сохранение координат, полученных Google Maps GeocodingApi, в базе данных Oracle и вычисление расстояний между ними с помощью SDO_GEOM.SDO_DISTANCE

Я написал приложение Spring, в котором я использую com.google.maps.GeocodingApi.GeocodingApi для получения координат для адресов. После этого я использую метод com.vividsolutions.jts.geom.GeometryFactory.createPoint() для создания точки, которую я могу сохранить в своей базе данных Oracle. Я создал GeometryFactory следующим образом: new GeometryFactory(new PrecisionModel(), 3857).

Я построил пространственный индекс для столбца координат в конкретной таблице со следующим кодом, чтобы я мог запускать для него пространственные запросы:

INSERT INTO USER_SDO_GEOM_METADATA(TABLE_NAME, COLUMN_NAME, DIMINFO, SRID) VALUES('ADRESSE', 'KOORDINATE', SDO_DIM_ARRAY(SDO_DIM_ELEMENT('X', -180, 180, 0.05), SDO_DIM_ELEMENT('Y', -90, 90, 0.05)), 3857);

CREATE INDEX koords ON ADRESSE (KOORDINATE) INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS ('layer_gtype=POINT sdo_max_memory=200000000');

Когда я просто получаю координаты и представляю их на карте Google Maps, все работает, как и ожидалось. У меня проблема в том, что пространственные запросы, которые я использую для фильтрации данных, похоже, не работают должным образом. Я использую SDO_WITHIN_DISTANCE для получения всех координат, которые находятся в радиусе 100 км от координаты, которую я использую в качестве параметра. После этого я использую SDO_GEOM.SDO_DISTANCE для вычисления расстояния между координатами в км. Результирующие маркеры на карте всегда имеют сферическую форму, а не круг, и вычисленные расстояния также совершенно неверны. Я пробовал много SRID, но расчеты всегда были неверными. Я подозреваю, что мне нужно преобразовать координаты или что я должен хранить их с другим SRID, чтобы вычисления, сделанные функциями Oracle, дали мне ожидаемые результаты, но с этого момента я не мог заставить это работать.


person Lutz W    schedule 14.07.2020    source источник
comment
Можете ли вы показать содержимое вашей таблицы ADDRESSE? Достаточно одного ряда. Google возвращает координаты в долготе/широте WGS84. Это SRID 4326, но вы указали 3857, что неверно, если только вы не преобразовали их явно в эту проекцию.   -  person Albert Godfrind    schedule 15.07.2020
comment
@AlbertGodfrind: я получил SRID 3857 из [документов. .oracle.com/database/121/SPATL/. Даже если я попытаюсь рассчитать вручную расстояние между двумя координатами, которые я взял с карт Google, результат будет неверным. SELECT SDO_GEOM.SDO_DISTANCE( SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(52.018156, 8.703915, NULL), NULL, NULL), SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(52.0085445, 8.6942913, NULL), NULL, NULL), 0.5, 'unit=KM' ) FROM dual; дает мне 1,5 км, но если я измеряю расстояние непосредственно на Google Maps, это всего 1,26 км.   -  person Lutz W    schedule 16.07.2020
comment
Просто для ясности: все пространственные данные хранят и обрабатывают географические координаты в долготе/широте. Как написано (52,0 долготы, 8,7 широты), эта точка находится в океане примерно в 200 км к востоку от побережья Сомали. Написано как (долгота 8,7, широта 52,0) это точка примерно в 5 км к востоку от Эссена.   -  person Albert Godfrind    schedule 16.07.2020
comment
О SRID 3857: это код глобальной проекции Меркатора, введенный Google и используемый на картах, опубликованных Google Maps, и с тех пор используется большинством производителей онлайн-карт. Обратите внимание, что он не предназначен для хранения каких-либо данных. Заметьте также, что это математически неверно: оно основано на полностью сферическом представлении Земли. Но на самом деле земля немного сплющена у полюсов и более точно моделируется как эллипсоид.   -  person Albert Godfrind    schedule 16.07.2020
comment
Наиболее распространенным эллипсоидом является эллипсоид WGS84, используемый системой GPS. Координаты, которые вы получаете от Google, указаны в десятичных градусах WGS84. SRID для них — 4326. Обратите внимание, что другие эллипсоиды используются для локальных проекций. Но если не указано иное, «долгота/широта» означает WGS84 (код 4326).   -  person Albert Godfrind    schedule 16.07.2020
comment
@AlbertGodfrind Большое спасибо за ваши разъяснения! Думаю, мне бы никогда не пришло в голову перепутать широту с долготой, потому что представление на карте было правильным. Это просто сработало, потому что параметры маркеров тоже были в неправильном порядке. Изменение параметров и SRID решило мою проблему! Большое спасибо!   -  person Lutz W    schedule 17.07.2020


Ответы (1)


Как отметил в своих комментариях Альберт Годфринд, я использовал неправильный SRID и дополнительно перепутал широту с долготой.

person Lutz W    schedule 17.07.2020