2014-09-16 5 views
2

Я использую PostGIS = "2.0.1 r9979" и облицовочный следующее сообщение об ошибке:PostGIS: ОШИБКА: Ошибка синтаксического анализа - недопустимая геометрия

ERROR: parse error - invalid geometry 
HINT: "POINT(18.570275,7" <-- parse error at position 17 within geometry 
CONTEXT: SQL function "st_dwithin" during inlining 

при попытке SQL:

SELECT addressid FROM maddress 
    WHERE ST_DWithin(geocode, 'POINT(20.0924758 72.7341809 19.137381,72.837223)' , 100.0); 

я хотел бы выберите адреса между точками, указанными в запросе.

Я проверил синтаксис и в соответствии с синтаксисом я поставил значения в query.Please, дайте мне знать коррекцию.

+0

Вам нужно будет описать, как вы создаете свои геометрические формы, потому что это то, что ошибка. –

+0

@MikeT. OP ответил в комментариях, геокод оказывается полями lat/lon отдельно, и если вы посмотрите на POINT, у него есть запятая. Таким образом, здесь есть около 3 вопросов. –

ответ

1

Если вы пытаетесь найти точки, находящиеся между двумя точками, вам, вероятно, потребуется дважды использовать ST_DWith, чтобы вы получили точки, находящиеся на пересечении круга, основанного на точке 1, и окружности, основанной на точке 2 , например,

SELECT addressid FROM maddress 
WHERE ST_DWithin(geocode, ST_MakePoint(20.0924758, 72.7341809), 100.0) 
AND ST_DWithin(geocode, ST_MakePoint(19.137381, 72.837223), 100.0); 

Обратите внимание, что единицы в SRID единиц, что в вашем случае, как представляется, быть 4326, так что вы можете преобразовать ваши координаты в метрах, использовать тип географии данных, поэтому расстояние будет в метрах или конвертировать расстояние до градусов - есть разные варианты. Я уверен, что вы видели ST_DWithin docs, который объясняет эти параметры. Вы также можете рассмотреть параметр use_spheroid.

Вместо ST_MakePoint выше, вы можете также использовать ST_GeomFromText, который принимает форму «POINT (х)», как вы первоначально имели опционально позволяет указать SRID, например, с помощью 4326, вы также можете написать запрос как :

SELECT addressid FROM maddress 
WHERE ST_DWithin(geocode, ST_GeomFromText('POINT(20.0924758 72.7341809)',4326), 100.0) 
AND ST_DWithin(geocode, ST_GeomFromText('POINT(19.137381 72.837223)', 4326), 100.0); 

EDIT После комментариев от OP, то получается, что геокод не столбец геометрии. Вы можете исправить это, выполнив.

ALTER TABLE maddress ADD COLUMN geom GEOMETRY (POINT, 4326); 
UPDATE maddress set geom=ST_MakePoint(lng,lat); 
CREATE INDEX ix_spatial_geom on maddress using gist(geom); 

Затем вам необходимо использовать геометрию вместо геокода в запросах выше. Я предполагаю, что ваши очки в 4326.

+0

спасибо за ответ..и пробовал это, но показывая тот же результат – user3129056

+0

Извините, мой плохой, я оставил запятую во втором. Точка должна быть разделена пробелами. Я редактировал anser. –

+0

yop..i hv заметил это и пробовал без запятой .. – user3129056

1

я мастерил ту же ошибку при использовании выберите ST_GeomFromText ('POINT (-27.75, 114.75)', 3857)

вместо выберите ST_GeomFromText ('POINT (-27,75 114,75)», 3857)

должны удалить запятую seprator