Я написал приложение 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, дали мне ожидаемые результаты, но с этого момента я не мог заставить это работать.
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