Найти точки, которые лежат в пределах набора координат


9

У меня есть база данных PostGIS, и я хочу найти точки, которые лежат в некотором регионе (ограничивающий прямоугольник). У меня есть два набора координат, из которых я могу получить все четыре точки прямоугольника, которые образуют прямоугольник (при необходимости). Мой столбец данных называется «точка», и он также имеет тип точки.

  • Есть ли в любом случае указать четыре набора координат (широта / долгота) и получить все точки, которые лежат в рамке.
  • Или укажите две точки и позвольте DB отработать углы прямоугольника и вернуть точки в пределах

На всякий случай, мне неясно, чего я хочу достичь. Эквивалент с 'vanilla' sql, если бы вместо точки было поле lat и long:

SELECT * FROM myTable where lat> xMin AND lat < xMax AND long > yMin and long < yMax

ОБНОВЛЕНО РЕДАКТИРОВАТЬ:

Я пытаюсь решить проблему Подземья. Сначала у меня не было конструктора ST_MakePoint (теперь у меня есть), и я все еще получаю очень похожую ошибку (только на другом персонаже).

SELECT * FROM myTable WHERE ST_Within(ST_MakePoint(point),GeometryFromText('POLYGON((75 20,80 30,90 22,85 10,75 20))',4326))

и я получаю эту ошибку:

ERROR:  function st_makepoint(point) does not exist
LINE 1: SELECT * FROM triples WHERE ST_Within(ST_MakePoint(point),Ge...
                                          ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.


********** Error **********

ERROR: function st_makepoint(point) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 39

РЕДАКТИРОВАТЬ:

В краткосрочной перспективе я могу решить это с:

SELECT * FROM triples WHERE box '((point1),(point2))' @> point

Но мне придется разобраться, почему ни одна из функций PostGIS не работает для меня.


Предпочтительным способом является размещение только в одном месте. Если это место не подходит или не работает, его легко перенести. Я не собираюсь предпринимать никаких действий, потому что ваш вопрос должен касаться ГИС, но я настоятельно призываю вас удалить перекрестный пост на SO.
whuber

1
@whuber .. сделано.
Анкур

Работает ли - выберите GeometryFromText ('POLYGON ((75 20,80 30,90 22,85 10,75 20))', 4326)?
Шон

Я не совсем понимаю, что вы имеете ввиду. Я попробовал разные варианты того, что вы сказали, и они не сработали
Анкур

Каков столбец «точки», на который вы ссылаетесь в ST_MakePoint (точка)
underdark

Ответы:


9
SELECT * FROM myTable WHERE 
ST_Within(the_geom, GeometryFromText ('POLYGON((75 20,80 30,90 22,85 10,75 20))', 4326))

<- заменить координаты при необходимости


извините за глупый вопрос, но что такое "the_geom" ... я должен псевдоним запроса SELECT * FROM myTable и становится ли это значение "the_geom"
Ankur

Извините, конечно, это столбец в поиске. Я бы назвал это db_column или что-то в этом роде, но postgis docs думает иначе ... это имеет смысл, когда вы знаете, что это такое.
Анкур

1
Когда я запускаю это, я получаю ошибку, которая говорит, что GeometryFromText не существует. Я использую Postgis 2.0. Я также попробовал st_geomfromtext.
Picardo

@underdark, возможно, я ошибаюсь, но кажется, что скобки отсутствуют.
Давиде Пасторе

3

Похоже, вы хотите BBOX (Bounding Box) от ваших очков - так что ST_Extent будет выгодно.

BBOX2D

http://www.bostongis.com/postgis_extent_expand_buffer_distance.snippet

будет предоставлять страницу http://postgis.net/docs/ST_Extent.htm, но на сервере возникают проблемы


Re: сервер ... Я знаю, я пытался посмотреть на кэш-копии Google :)
Ankur
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.