با سلام و وقت بخیر
در این پست میخوام در مورد یکی از نوع های geometric به نام polygon صحبت کنم.
چند وقت پیش تو یک پروژه ای که مربوط به مختصات جغرافیایی بود و در این پروژه قرار بود که کاربر با موبایل مختصات زمینی و ثبت کنه به اصطلاح نقطه زنی کنه و به صورت Polygon بفرسته و ما هم در دیتابیس ذخیره کنیم کار میکردم.
خودم قبلا تجربه کار با type های geometric و نداشتم و با جستجوهای که انجام دادم با یه پکیج آشنا شدم که برای doctrine هست و اسمش alexandret/doctrine2-spatial هست آشنا شدم که نوع های geometric رو هندل میکنه.
این پکیج و نصب کردم و ازش استفاده کردم،دیتابیس من MySQL بود و مختصاتی و که وارد میکردم در دیتابیس ذخیره میکرد ولی مشکلی که وجود داشت شمای نقشه رو نمایش نمیداد و فقط نقطه های که زده بودم را رسم میکرد. وقتی ما از نوع polygon استفاده میکنیم همراه با lat , long های که میفرستیم یه srid و هم باید بفرستیم که یک کد جنرال هست که همیشه باید فرستاده بشه، این کد در MySql به صورت null ذخیره میشد و این مشکل را با سوئیچ دیتابیس به سمت PostgreSQL حل کردم.
حالا بریم ببینیم به چه صورت میتوانیم از این پکیج استفاده کنیم.
1- نصب
برای نصب پکیج کافیست پکیج alexandret / spatial2-doctrine را در composer.json خود اضافه کنید
$ composer require alexandret/doctrine2-spatial
اگر از composer نمیخواهید استفاده کنید می توانید با کلیک به روی لینک این پکیج و دانلود کنید.
2- پیکره بندی
برای پیکره بندی Doctrine spatial extension در سیمفونی فقط کافیست فایل config/doctrine.yaml خود را ویرایش کنیم.
انواع هندسی خود را وارد میکنیم، میبینیم type های دیگری هم وجود دارد، ما در این پست در مورد نوع polygon صحبت میکنیم.
doctrine: dbal: types: geometry: CrEOF\Spatial\DBAL\Types\GeometryType point: CrEOF\Spatial\DBAL\Types\Geometry\PointType polygon: CrEOF\Spatial\DBAL\Types\Geometry\PolygonType linestring: CrEOF\Spatial\DBAL\Types\Geometry\LineStringType
3- در مرحله بعد کافیست نوع polygon رو به موجودیت خود اضافه کنیم
namespace App\Entity; use CrEOF\Spatial\PHP\Types\Geometry\Polygon; use Doctrine\ORM\Mapping as ORM; class PolygonEntity{ /** * @var int * @Id * @GeneratedValue(strategy="AUTO") * @Column(type="integer") */ protected $id; /** * @var Polygon * * @Column(type="polygon", nullable=true) */ protected $polygon; public function getId() { return $this->id; } /** * Get polygon. * * @return Polygon */ public function getPolygon() { return $this->polygon; } /** * Set polygon. * * @param Polygon $polygon polygon to set * * @return self */ public function setPolygon(Polygon $polygon) { $this->polygon = $polygon; return $this; }} }
4- بعد از اینکه مدل خود را ایجاد کردید migration خود را ایجاد میکنید و به دیتابیس ارسال میکنید
5- یک نمونه از ریکوئست ای که به صورت رست ایجاد کردم و ایجا میفرستم که با هم ببینیم.
{ "polygon": { "rings": [ [ [ 51.337116612000045, 35.700401726000052 ], [ 51.337528042000031, 35.700363758000037 ], [ 51.337433070000031, 35.700090746000058 ], [ 51.337126481000041, 35.70009549100007 ], [ 51.337116612000045, 35.700401726000052 ] ] ], "srid": 4326 } }
این مختصاتی که وارد کردم مختصات ناحیه ای در میدان آزادی هست.
در polygon نقطه شروع و پایان باید یکی باشد.
همیشه مقدار srid برابر با 4326 باید باشد که به صورت جنرال است
ممنون که تا اینجا همراهم بودید و امیدوارم که مفید واقع شده باشد.
با تشکر امیر سلخوری هستم توسعه دهنده.
01000001011011010110100101110010001000000101001101100001011011000110101101101000011011110111001001101001