شما اینجا هستید

به اشتراک گذاشتن تجربه کار با چند ماژول نقشه

map

سلام قبل از هر چیزی بگم این تجربیات شخصی و تا حدودی ناقص خودمه و چون میخواستم دوستان این موضوعات رو کامل کنند همچنین در توسعه دو سه ماژولی که در انتهای مقاله در موردشون میخونید کمک کنند یه تایپک هم تو انجمن با عنوان( توضیح , مقایسه و گرفتن کمک در خصوص ماژول های مرتبط با نقشه و مکان ) ایجاد کردم تا هرکس که می تونه به تکمیل شدن این بحث کمک کنه.
http://www.drupalcms.ir/node/7104
من می خواستم تو سایتم آدرس کاربر ها رو روی نقشه نشون بدم در نتیجه رفتم سراغ ماژول هایی که برای این موضوع طراحی شده بودن چون ابتدا تازه کار بودم و همینطور انتظاراتم هم کم بود رفتم دنبال ساده ترین و کم حجم ترینشون.
هدف من این بود که کاربر روی یه نقشه مکان خودش رو پیدا و ثبت کنه و منم همون تصویر رو تو یه بلاک تو صفحه کاربر نشون بدم.
خیلی زود تو جستجوهام به ماژول geolocation رسیدم (آموزش استفاده از این ماژول تو همین سایت هست) البته دو تا ساب ماژول هم با این ماژول هست به نام های geolocation_googlemaps و geolocation_html5
ماژول geolocation به شما این توانایی رو میده که یک فیلد تعریف کنید برای دریافت مکان به صورت طول و عرض جغرافیای که اصلا به درد من و البته کاربرای سایتم نمیخورد. با فعال کردن ساب ماژول geolocation_googlemaps این امکان به وجود آمدن که برای دریافت آدرس از گوگل مپ استفاده بشه و کاربر روی نقشه مکان خودش رو پیدا کنه و اون رو علامت گذاری کنه در ضمن یه توانایی دیگه هم به قسمت نحوه نمایش فیلدها اضافه شد و اون هم نمایش تصویر مکان کاربر برروی نقشه گوگل با دو صورت استاتیک و پویا.
(قبل از اینکه بقیه متن رو بخونید این موضوع رو در نظر داشته باشید که geolocation_googlemaps برای نصب نیازی به فعال کردن ماژول geolocation نداره و در واقعه خودش یه ماژوله)
یه مدت تقریباً زیادی من از این روش راضی بودم و مشکلی نداشتم اما بعدا تصمیم گرفتم که مکان همه کاربر هام رو روی یه نقشه به صورت همزمان نشون بدم اینجا بود که ماژول geolocation کارم رو راه نمینداخت یه ماژول به اسم geolocation_views هست که البته پایدار نیست و رنگش قرمزه و منم امتحانش نکردم.
طی جستجوهام به ماژول های زیر رسیدم :
Leaflet
Get Locations
OpenLayers
GMap
IP Geolocation Views and Maps
• و چندتا ماژول دیگه
و همچنین جدول زیر که مقایسه ای از همه اونا بود البته مال چند سال پیشه و باید یه تغییراتی داخلش داده بشه: چون نتونستم این جدول و تو این سایت درست نمایش بدم آدرسشو می زارم تا دوستان خودشون برن و ببینندش.
آدرس این جدول:
Comparison of mapping modules
تو جستجوهای دیگه ای هم که داشتم یه این نتیجه رسیدم که از Leaflet یا Openlayers استفاده کنم(راستش دلیل این انتخابم رو یادم نمیاد)
چون ماژول Openlayers حجم زیاد و برای نصب احتیاج به چندین ماژول سنگین دیگه هم داشت اول به سراغش نرفتم و Leaflet رو نصب کردم.
ماژول Leaflet اینطور نیست که امکان ساخت یک فیلد برای دریافت اطلاعات مکان رو به ما بده و فقط یک شیوه نمایش به views و نحوه نمایش فیلد ها اضافه میکند در نتیجه برای این کار احتیاج به ماژولی داره که این کار رو برامون انجام بده واین ماژول هم چیزی نیست به جز Geofield.

Leaflet

البته اگه تجربه الانم رو داشتم مستقیم میرفتم سراغ IP Geolocation Views and Maps چون این ماژول هم امکانات زیادی داره و هم با geolocation که قبلا نصب و استفاده کرده بودم همخوانی داره و احتیاج به نصب ماژول جدیدی جهت دریافت مکان ندارد ولی خدارو شکر که اول Leaflet رو نصب کردم و با نقشه ای به جز گوگل آشنا شدم.
برگردیم سر Geofield ، به نظرم این ماژول با ماژول geocoder بهترین بیشترین سازگاری با همه ماژولهای جدول بالا رو داره.
با نصب Geofield میتونیم یک فیلد برای دریافت اطلاعات مکان ایجاد کنیم و با نصب Geofield Map که از ساب ماژول های این ماژول است میتونیم در قسمت نحوه نمایش فیلدها تنظیمات رو به صورتی قرار بدیم تا این نقطه روی نقشه گوگل نشون داده بشه.
ماژول Geofield یک اشکال خیلی بزرگ داشت و اونم این بود که کاربر در زمان ثبت مکان خود قادر نبود این مکان رو بر روی نقشه علامت گذاری کنه ومجبور بود که مکان رو به صورت یک عدد مثلا طول عرض جغرافیایی وارد کنه و این اون چیزی نبود که من میخواستم در نتیجه دنبال راه چاره گشتم البته خیلی زودهم به نتیجه رسیدم ماژولی که من احتیاج داشتم geolocation_googlemaps بود که از ساب ماژول های geolocation هست و همینطور که قبلا هم گفته بودم برای فعال شدن نیازی به نصب geolocation هم نداره.
خلاصه با نصب ماژولهای ( Leaflet Geofield Geocoder Geolocation_googlemaps) و سرو کله زدن باهاشون من به نتیجه ای که میخواستم رسیدم

Leaflet

البته بعد که تصمیم گرفتم مکان شخص بازدید کننده از سایت رو هم روی نقشه نمایش بدم مجبور به نصب (ip_geoloc) IP Geolocation Views and Maps

ip_geoloc

چون کار با Leaflet و IP Geolocation Views and Maps راحته من در مورد اونا توضیحی نمیدم و اگه کسی خواست استفاده کنه توضیحات کافی رو تو صفحه این ماژول ها می تونه نگاه کنه.
((ماژول Leaflet از نقشه openstreetmap برای نمایش نقاط بر روی نقشه استفاهده میکنه و و هنگام کار با این ماژول متوجه شدم سرعت لود شدنش خیلی بیشتر از google map هست و به همین دلیل بعد از این که ماژول IP Geolocation Views and Maps رو تست کردم و فهمیدم که می تونه مستقل از Leaflet نقاط رو روی نقشه گوگل مپ نمایش بده ازش صرف نظر نکردم))
همچیز خوب بود تا یه روز دیدم وقتی میخوام یه مکان جدید روی نقشه مشخص کنم ویا وقتی میخوام یک مکان رو که قبلا ثبت کرده بودم ویرایش کنم صفحه google map بالا نمیاد و یه خطا میده مبنی بر اینکه

Oops! Something went wrong.
This page didn't load Google Maps correctly. See the JavaScript console for technical details

googlemaps

و این معنیش این بود که باید بری به قسمت developers.google.com و یه API key بگیری که به نظرم مجانی هم باشه اما این سایت برا ایران قابل دسترسی نیست و اون رو تو قسمت mysite.ir/admin/config/services/googlemaps وارد کنی، خوب من چون این قابلیت برا ایران غیر فعال بود تصمیم گرفتم برای وارد کردن آدرس هم از نقشه اپن استریت استفاده کنم و این باعث شد که برم دنبال ماژولی بگردم که این قابلیت رو به سایتم بده
توی جستجوهام به دوتا ماژول رسیدم برا geolocation و Geofield که هرکدوم یه مشکلاتی دارن و بعداً در موردشون صحبت می کنم (leaflet_widget و geolocation_osm ). در نهایت مجبور شدم دو ماژول Openlayers و getlocations رو هم نصب و امتحان کنم که هر دو تا شون رو تا حدودی براتون شرح میدم
اول ماژول گت لوکیشن:
در نگاه اول شما یه ماژول با حجم خیلی زیاد می بینید ولی این حجم زیادش به خاطر تعداد زیاد ساب ماژول های این ماژول هست به نظر من پر کاربردترین این ساب ماژول ها یکیش Getlocations Fields هستش که امکان ساخت یک فیلد برا گرفتن آدرس به صورت تایپ آدرس و همینطور پیدا کردن و ثبت آدرس بر روی نقشه وهمچنین گرفتن یه سری اطلاعات دیگه مثل شماره تلفن و... در اختیار شما قرار میده به نظرم ماژول قشنگیه ولی بازم مشکلی که داره اینه که از گوگل مپ استفاده میکنه البته تو لیست نقشه هایی که داره میتونید نقشه دیگه ای رو به عنوان پیش فرض قرار بدین ولی این گزینه کاربردی نداره چون تو فایل توضیحاتش نوشته که باید به صورت دستی کدش رو وارد کرد و من نتونستم کدشو جایی پیدا کنم متن انگلیسیش اینه:
https://github.com/bobhutch/getlocations
تو فایل README این ماژول هم میتونید این نوشته رو پیدا کنید
Getlocations supports the use of other sources of maps besides Google,
you can show maps from OpenStreetMap, OpenCycleMap, Stamen and Esri.
Developers can add their own maps using
hook_getlocations_map_providers(), see the function
getlocations_getlocations_map_providers() for examples.
از دوستان خوآهش می کنم اگه میتونن این کد رو بنوسن
بقیه ساب ماژول ها رو خودتون می تونید ببینید برا من GetLocations Leaflet و Getlocations Gps جالب بودن ویه نگاهیشون کردم
برا نمایش نقاط با views تو صفحه این ماژول گفته که این ماژول با geolocation و Geofield و Getlocations Fields سازگار هست، برا من با دوتای اولی سازگار نبود ولی سومی رو امتحان نکردم خوب حتما باهاش سازگاره چون تو یه پکیج هستن ولی چیزی که برام عجیب بود تو تنظیماتش اصلا جایی برای مشخص کردن فیلد منبع و همچنین فیلدهایی که با کلیک بر روی نشانگر روی نقشه نمایش داده بشن نداشت؟!

viewsGet Locations views

در ضمن با نصب ماژول Getlocations Fields شما قادر خواهید بود یک نوع views به نام Getlocations ایجاد کنید که حتما برا فیلدهای Getlocations Fields هستش.

Get Locations views

البته فراموش نکنید که این ماژول در صفحه views نماهای زیادی رو برا نمونه ایجاد می کنه وسعی کنید اونها رو فعال و مشاهده کنید
دوستانی که با این ماژول کار کردن لطف کنن برای راهنمایی من و سایر دوستان توضیحات تکمیلی رو بدن.
ماژول اپن لایرز هم یه نگاهی انداختم
این ماژول برا نصب به 3 ماژول libraries_cdn و registry_autoload و service_container و لایبراری و سی تولز و جی کوری آپدیت نیاز داره و یه لایبراری مخصوص خودش هم باید دانلود کرد و در پوشه لایبراری قرار داد البته به نظر می رسه با نصب libraries_cdn احتیاجی به دانلود این لایبراری نباشه و نکته دیگه ای هم که باید در نظر گرفت اینه که ورژن لایبراری باید زیر 3.9 باشه تا نقشه نماش داده بشه
بعداز نصب ماژولهای بالا و ساب ماژول Openlayers UI شما میتونید تنظیمات این ماژول رو مشاهده و تغییر بدید:
وقتی به صفحه تنظیمات میرید با تغیر ورژن لیبراری به 3.8 یا کمتر تصویر زیر براتون نمایش داده میشه

OpenLayers

همینطور که میبینید نقشه ای به شما نمایش داده نمیشه و فقط یک شیوه نمایش نقشه وجود داره البته مشکلی نیست شما میتونید با رفتن به قسمت maps و فعال کردن دو نوع نمایش دیگه ای که خودش به صورت دیفالت داره انتخابهاتون رو بیشتر کنید حتی میتونید خودتون یه شیوه نمایش تعریف کنید البته با نصب ساب ماژول Openlayers Geofield دو نوع نمایش دیگه براتون فعال میشه که امکانات خوبی داره.
اما برای حل مشکل نمایش نقشه به نظرم سه تا روش دارید یک اینکه به قسمت منابع (sources) برید و یا یک منبع جدید تعریف کنید و در مرحله Source Type بسته به نیازتون یکی از سورس ها رو انتخاب کنید و اون رو به layers هایی که وجود داره اضافه کنید ویا راحت تر از همه این که یکی از منابع مثلاْ openlayers_source_mapquest_osm رو ویرایش و در مرحله سورس تیپ سورس OSM یا هر چیز دیگه ای که لازم دارید رو انتخاب کنید البته تخلیه حافظه موقت رو فراموش نکنید و روش سوم هم فعال کردن ساب ماژول Openlayers Examples که انتخاب های شمارو خیلی زیاد و تا حدودی به امکانات این ماژول آشنا میکنه البته فراموش نشه بع نصب این ماژول بلاک اونم فعال کنید.
برای ایجاد فیلد برای گرفتن اطلاعات مکان باید بازم ماژول Geofield رو فعال و همینطور ساب ماژول Openlayers Geofield رو هم باید فعال کنید البته با این ساب ماژول علاوه بر یک نقطه می تونید خط و یا اشکال هندسی دیگر هم ذخیره کنید.

OpenLayers

من این کارها رو کردم و یه نقطه هم رو نقشه باهاش ثبت کردم آما موقع نمایش این فیلد نتونست نقطه ذخیره شده رو بهم نشون بده همینطور با views و با استفاده از نحوه نمایشی که این ماژول فراهم می کنه نتونستم هیچ نقطه ای رو روی نقشه نشون بدم. احتمالاْ این بخاطر این بوده که بلد نبودم با این ماژول کار کنم و البته باید بگم کار با این ماژول نصبت به ماژول های دیگه مثل ip_geoloc و Leaflet به مراتب سخت تره. اگه می خواید کار تخصصی بر روی نقشه انجام بدید احتمالا این ماژول ، ماژولی هست که بتونه کارتون رو راه بندازه ( با فعال کردن Openlayers Examples و مشاهده بلاکی که در اختیارتون میزاره متوجه می شید که منظورم از کار تخصصی چی هست البته ماژول های دیگه ای هم طراحی شده اند که برای تکمیل کارایی های این ماژول هستش)
بازم می گم که این نوشته ها تجربیات شخصی منه و احتمالا خیلی ناقصه و بازم از دوستانی که تجربه بیشتری دارن می خوام نوشته های منو تصحیح و تکمیل کنند
وخلاصه تجربیات من میشه این:

  1. اگر می خواهید کاربر یا در کل کسی که می خواد ایجاد محتوا بکنه مکان مورد نظر رو روی نقشه انتخاب و ثبت کنه و فقط همون نقطه رو در یک بلاک در یه جای سایت نشون بدین بهترین انتخاب geolocation هستش که هم براتون یه فیلد تعریف میکنه و هم در نحوه نمایش فیلد، نمایش بر روی نقشه رو براتون فراهم میکنه
  2. اگه میخواید سناریو بالا رو داشته باشید ولی بجای نمایش یک نقطه چند نقطه خاص و یا همه نقاط رو روی نقشه نمایش بدین بازم بهترین انتخاب ماژول geolocation برای ایجاد فیلد و ماژول IP Geolocation Views and Maps برای ایجاد views میباشد البته ماژول GMap هم میتونه انتخاب مناسبی باشه اما اما در نظر داشته باشید اینا برا زمانی هست که با api kay گوگل به مشکل بر نخورید و همچنین سرعت لود شدن نقشه براتون خیلی مهم نباشه
  3. در صورتی که روشهای تخصصی تری برای ورود اطلاعات جغرافیای لازم دارید باید برید به سراغ ماژول Geofield
  4. اگر با گوگل به مشکل دارید براید سراغ Geofield به اضافه ماژول leaflet_widget و برای نمایش این نقاط بر روی نقشه یا views از ماژول Leaflet استفاده کنید و اگر امکانات بیشتری میخواهید متوانید ماژول هایی که برای تکمیل این ماژول نوشته شده اند رو هم نصب و استفاده کنید در نهایت میتونید ماژول IP Geolocation Views and Maps رو هم در کنار این ماژول ها نصب کنید و از امکانات اون هم استفاده کنید.(این امکانات رو میتونید تو جدول با لا ببینید).
  5. ماژول OpenLayers هم تقریبا همه امکانات بالا و شاید بیشتر رو داره پس اگر وقت و حوصله داری و انگلیست هم بد نیست اگه یادش بگیری مطمئنا ضرر نمی کنی، برا ماژول Get Locations هم همین نظر رو دارم

اما مشکلاتی که وجود داره و من این همه موضوع گفتم تا به اینا برسم :
چون گوگل مپ درخواست api kay می کنه همچنین جون سرعتشم تعریفی نیس پس بهتره بریم سراغ openstreet map این نقشه به صورت پیش فرض تو openlayrs هست ولی چون پیچیدس و کار کردن باش سخته و هم این که به نظرم ماژول سنگینی اومد و سرعت سایت رو کمی پایین آورد من که به سراغش نمیرم. اما چیکار باید کرد چون ماژول هایی که امکان ایجاد فیلد مکان رو میدن با openstreetmap سازگار نیستند و برای Getlocations Fields هم باید کد نوشته بشه که من نتونستم تو وب این کد رو پیدا کنم (خواهش میکنم اگه کسی بلده ، این کد رو بنویسه و در اختیار بقیه قرار بده)، اما ناراحت نباشید چون یه تلاش کوچیک برای حل این مشکل شده که البته خالی از اشکال نیس ولی امید وارم با کمک اساتیدی که این مطلب رو می بینند این اشکالات حل بشه:
برای ماژول Geofield یه ماژول کمکی نوشته شده که فعلا کاملا پایدار نیست و دارای مشکلاتی و کمبود های هست (رنگش در صفحه دانلود زرده) اسم این ماژول leaflet_widget هست این ماژول این امکان رو به Geofield میده که روی نقشه openstreet بتونید یک یا چند نقطه یا شکل رو درج و ثبت کنید اما مشکل و کمبود هاش چی هست :

  1. این ماژول این خاصیت رو نداره که با یک کلیک بصورت اتوماتیک مکان کسی رو که داره دنبال مکان خودش می گرده رو پیدا کنه
  2. این ماژول قابلیت جستجو رو نداره و باید نویسنده رو نقشه بگرده و مکان مورد نظرش رو پیدا کنه
  3. با این ماژول میشه یک یا چند نقطه و شکل رو روی نقشه مشخص کرد و برای پاک کردن این شکل و نقشه ها اول با ید اون شکل رو انتخاب کرد بعد اون حذف کرد این مشکل نیست ولی من می خوام وقتی روی دلیت کلیک میشه هرچی رو نقشه هست حذف بشه و احتیاجی به انتخاب کردنش نباشه ، این کار رو برای کاربرا راحتتر و قابل فهم تره
  4. درسته با این ماژول میشه چند نقطه و شکل رو روی نقشه ثبت کرد اما اگه پس از سبت بخواهید این نقاط و اشکال رو ویرایش کنید قادر به این کار نخواهید بود و تنها راهتون حذف و دوباره ایجاد کردنشه و ویرایش فقط موقعی کار می کنه که فقط یک نقطه روی نقشه ثبت بشه

leaflet_widget

اگه به صفحه این ماژول رفتین یادتون نره حتما یه سر به قسمت issues ها بزنید به نظرم چیزای خوبی داره.
ماژول دومی که در در حال تولید هست ماژول geolocation_osm هستش این ماژول رو می تونید از اینجاها دانلود کنید:
http://cgit.drupalcode.org/geolocation_osm
و
https://github.com/markaspot/mark-a-spot/tree/master/profiles/markaspot/modules/contrib/geolocation_osm

همونطور که از اسمش پیداس این یه ساب ماژول برا geolocation هست و قابلیت سازگاری با openstreetmap رو با این ماژول فراهم میکنه.
اما مشکلات این ماژول:
درسته این ماژول قابلیت جستجو و یافتن مکان فعلی نویسنده رو داره اما هیچکدومش کار نمیکنه و حتی مهمتر از همه قابلیت درج و ثبت مکانش درست کار نمی کنه. (شایدم من نتونستم راش بندازم)
درخواستی که از دوستان عزیز دارم اینه که اگر میتونن به تکمیل شدن این دو ماژول کمک کنن هم برا هفت هم برا هشت
pdf این مقله رو هم میتونید دانلود کنید.
لطفا این موضوع رو توی صفحه زیر دنبال و تکمیل کنید
http://www.drupalcms.ir/node/7104