amir salkhori
amir salkhori
خواندن ۵ دقیقه·۴ سال پیش

استفاده از type های geometric در سیمفونی(polygon)

با سلام و وقت بخیر

در این پست میخوام در مورد یکی از نوع های 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=&quotAUTO&quot) * @Column(type=&quotinteger&quot) */ protected $id; /** * @var Polygon * * @Column(type=&quotpolygon&quot, 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- یک نمونه از ریکوئست ای که به صورت رست ایجاد کردم و ایجا میفرستم که با هم ببینیم.

{ &quotpolygon&quot: { &quotrings&quot: [ [ [ 51.337116612000045, 35.700401726000052 ], [ 51.337528042000031, 35.700363758000037 ], [ 51.337433070000031, 35.700090746000058 ], [ 51.337126481000041, 35.70009549100007 ], [ 51.337116612000045, 35.700401726000052 ] ] ], &quotsrid&quot: 4326 } }

این مختصاتی که وارد کردم مختصات ناحیه ای در میدان آزادی هست.

در polygon نقطه شروع و پایان باید یکی باشد.

همیشه مقدار srid برابر با 4326 باید باشد که به صورت جنرال است

ممنون که تا اینجا همراهم بودید و امیدوارم که مفید واقع شده باشد.

با تشکر امیر سلخوری هستم توسعه دهنده.
01000001011011010110100101110010001000000101001101100001011011000110101101101000011011110111001001101001

polygon
01000001011011010110100101110010001000000101001101100001011011000110101101101000011011110111001001101001
شاید از این پست‌ها خوشتان بیاید