Есть ли способ выбрать lat1, lat2, lon1, lon2 из Envelope (Poly) в MySQL?

Если у меня есть столбец с именем Poly типа polygon в MySQL, и я хочу получить угол NW, угол NE, угол SE и угол SW, как мне это сделать? Из Envelope() должны быть lat1, lat2, lon1 и lon2, которые образуют четыре угла следующим образом: lat1, lon1 — это NW; lat1,lon2 — северо-восток; lat2, lon2 — ЮВ; а lat2,lon1 — ЮЗ. Когда я пытаюсь использовать X(PointN(Envelope(Poly),1)) AS lat1, он всегда возвращает NULL. Можно ли это сделать в MySQL?

SELECT
    X(PointN(Envelope(Poly),1)) AS lat1, X(PointN(Envelope(Poly),3)) AS lat2,
    Y(PointN(Envelope(Poly),1)) AS lon1, Y(PointN(Envelope(Poly),2)) AS lon2
FROM boundaries.mt_us_zip5_2013_boundaries_polys_bin
WHERE zip = '00601';

Приведенный выше запрос возвращает:

NULL,NULL,NULL,NULL

Вот как выглядит конверт:

SELECT AsText(Envelope(Poly))
FROM boundaries.mt_us_zip5_2013_boundaries_polys_bin
WHERE zip = '00601';

Этот последний запрос возвращает:

POLYGON((18.111929 -66.836366,18.250344 -66.836366,18.250344 -66.659293,18.111929 -66.659293,18.111929 -66.836366))

Я использую MySQL версии 5.5.36, даст ли обновление до новой версии MySQL необходимые мне функции?


person Roberto Murphy    schedule 09.05.2014    source источник


Ответы (2)


PointN определяется только на LineString, но, к счастью, вы можете вызвать ExteriorRing на Polygon, чтобы получить LineString. В вашем примере:

SELECT
    X(PointN(ExteriorRing(Envelope(Poly)),1)) AS lat1,
    X(PointN(ExteriorRing(Envelope(Poly)),3)) AS lat2,
    Y(PointN(ExteriorRing(Envelope(Poly)),1)) AS lon1, 
    Y(PointN(ExteriorRing(Envelope(Poly)),2)) AS lon2
FROM boundaries.mt_us_zip5_2013_boundaries_polys_bin
WHERE zip = '00601';
person Jan Misker    schedule 04.06.2014

Я недостаточно знаком с MySQL, если он имеет встроенную функцию, но моей первой мыслью было сначала найти центр многоугольника, а затем вычислить пеленг в каждой точке полигона от центра. Азимут 0 будет севером, а азимут 90 градусов будет востоком, таким образом, северо-восток будет 45 градусов. Найдите точки, ближайшие к углам 45 градусов, и получите углы.

Центр многоугольника находится здесь: Вычисление центральной точки широты и долготы многоугольника в PHP

Вычисление азимута по 2 точкам широты и долготы: http://www.movable-type.co.uk/scripts/latlong.html

person TreyA    schedule 09.05.2014
comment
Я могу сделать это на Java или PHP, проблема в том, что я хочу поместить логику в хранимую процедуру MySQL, чтобы ускорить процесс. - person Roberto Murphy; 09.05.2014