Получайте очки внутри ограничительной рамки - PullRequest
3 голосов
/ 08 марта 2011

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

//latlong - latitude, longitude of a place

SELECT * FROM places WHERE St_Contains(St_GeomFromText('Polygon((:top_left_long :top_left_lat, :bottom_right_long :bottom_right_lat))'), latlong);

Прежде всего - я получаю следующую ошибку:

 Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: :top_left_lat 

Что это значит? И второй вопрос - кормлю ли я эти параметры в хорошем состоянии? Я имею в виду - сначала долгота, потом широта?

Ответы [ 3 ]

6 голосов
/ 08 марта 2011

Вот запрос, который я использовал в старом проекте:

SELECT param1, param2, ... 
FROM messages 
WHERE ST_Contains( 
    ST_SetSRID(
        ST_MakeBox2D(
            ST_Point(0, 50), ST_Point(50,0)
        ), 
        4326
    ), 
    the_geom
)

the_geom был моим столбцом геометрии. Примечание: MakeBox2D принимает верхний левый и правый нижний

1 голос
/ 28 апреля 2011

С этими аргументами вы не можете построить Полигон .

A Полигон - плоская поверхность, определяемая 1 внешней границей и 0 или более внутренними границами.Каждая внутренняя граница определяет отверстие в многоугольнике.Треугольник - это многоугольник с 3 различными неколлинеарными вершинами и без внутренней границы.

Внешняя граница LinearRing определяет «вершину» поверхности, которая является стороной поверхности, с которой внешняя граница кажетсяпересечь границу в направлении против часовой стрелки.Внутренние LinearRings будут иметь противоположную ориентацию и выглядеть как по часовой стрелке, если смотреть сверху.

Утверждения для многоугольников (правила, которые определяют допустимые многоугольники) следующие:

a) Полигоны топологически замкнуты;

b) Граница многоугольника состоит изнабор LinearRings, которые составляют его внешние и внутренние границы;

c) Никакие два кольца в пересечении границы и кольца в границе многоугольника не могут пересекаться в точке, но только как касательная, например,

(взято из Спецификация реализации OpenGIS для географической информации - Простой доступ к функциям - Часть 1. Общая архитектура )

С этими аргументами вы можете создать box2d или создайте многоугольник, питающий все отдельные точки.

Две быстрые заметки:

  1. убедитесь, что ваши аргументы являются строками или St_GeomFromText не будет работать
  2. используйте ST_SetSRID для определения вашей системы координат, чтобы у вас не было неприятных результатов
0 голосов
/ 08 марта 2011

Я думаю, это потому, что :top_left_long и другие параметры не заменяются вашими значениями.

Можете ли вы распечатать запрос SQL перед выполнением?

...