Daha çox

Bir nöqtənin xəritədəki düzbucaqlının içində olub olmadığını necə bilmək olar?


Düzbucaqlı (a, b, c, d) təmsil edən dörd nöqtəm var. Bu nöqtələri mobil GPS-dən əldə etdim.

Mənim verilənlər bazamda bu iş yerləri cədvəli var:

bussId | uzunluq | enlik -----------------------------…

Düzbucaqlının içərisində hansı müəssisələrin olduğunu necə öyrənə bilərəm?

Bu funksiyanı həyata keçirmək istəyirəm:

isInsideRectangle funksiyası (Point buss, Point a, Point b, Point c, Point d)

burada nöqtə boylam və enlemi ehtiva edir.


Həqiqi cavab artıq aldığınız digər cavabların / şərhlərin qarışığıdır.

MySQL məhduddur

MySQL istifadə etdiyiniz yazılardan görürəm, problem budur ki, həqiqi həndəsələr deyil, yalnız 5.6-a qədər məhdudlaşdırıcı qutular edə bilər. http://dev.mysql.com/doc/refman/5.0/en/spatial-relation-functions.html

Sınırlayıcı qutudan istifadə etmək istəyirsinizsə:

SEÇİN * 'testdən' harada ('hüdudlar', geomfromtext ('POLYGON (0 0,10 0,10 10,0 10,0 0)'))

5.6.1-də həqiqi həndəsələri edə bilər, buna görə dəyişinEhtiva edirüçünST_CONTAINS. http://dev.mysql.com/doc/refman/5.6/en/spatial-relation-functions.html#functions-that-test-spatial-relationships-between-geometries

ST_CONTAINS ('hüdudları', geomfromtext ('POLYGON (0 0,10 0,10 10,0 10,0 0)')) 'testindən' SEÇİN

Məkan göstəriciləri

John'un şərhinə uyğun olaraq (və Davudun cavabı ilə bağlı problem), hansı verilənlər bazası ilə getmək istəsəniz, məlumatlarınızınöqtəməkan məlumat növü. Baxın: https://dev.mysql.com/doc/refman/5.0/en/spatial-datatypes.html - Bu, işləri daha da sürətləndirəcək məkan indeksləri daxil olmaqla bir sıra optimallaşdırmalardan istifadə etməyə imkan verir. Bu suala da baxın: https://stackoverflow.com/questions/5453063/benefits-of-spatial-over-using-standard-bounding-box-query


Boylam və enlik koordinatlarından PostGIS kimi (məkan) verilənlər bazanızda məkan strukturları (Nöqtələr) yarada bilərsiniz. (bax ST_GeomFromText)
BussId | əvəzinə boylam | enlem, BussSpatial adlı bir bussId, Point verilənlər bazasına sahib olacaqsınız. Bundan sonra yalnız aşağıdakıları soruşa bilərsiniz

var request = 'ST_CONTAINS (ST_MakePolygon (ST_GeomFromText (' LINESTRING ('+ a +', + '+' + b + ',' + '+ c' ',' + d + ')'), buss) ; ';

a, b, c və d dəyişənləriniz olduğu yerdə (əslində uzunluq, uzunluq və s. olmalıdır.)

Diqqətli olun: bu SQL ifadəsi birbaşa belə istifadə edilə bilməz, belədirSimlisizin

isInsideRectangle funksiyası (Point buss, Point a, Point b, Point d)

və funksiyanı daxilində istəyi edə biləcəyinizdən daha çox.


SQL üçün məhdud qutu sorğusu (PDO istifadə edərək)

$ sql = "BUSDİ SEÇİN tablename HARADA (ARASINDA enlik? VƏ?) VƏ (ARA ARAĞDA? VƏ?)"; $ stmt = $ dbh-> hazırlamaq ($ sql); // $ stmt-> bindParam (1, $ minLat) parametrləri təyin edin; $ stmt-> bindParam (2, $ maxLat); $ stmt-> bindParam (3, $ minLng); $ stmt-> bindParam (4, $ maxLng);

HARADA parametrlər düzbucaqlının yuxarı solundan və sağından gəlir


əgərxəritəmasanın bir sahəsi varsəhMəkan indeksli POINT tipli bunu edə bilərsiniz:

set @p = concat ('Çoxbucaqlı ((', _ x0, ", _ y0, ',', _ x1,", _ y0, ',', _ x1, ", _ y1, ',', _ x0,", _ y1, ', ', _x0, ", _ y0,')) '); mbr ehtiva etdiyi xəritədən * seçin (GeomFromText (@p), p);