أكثر

تصدير خرائط Openlayers برمجيًا إلى ملف صورة ثابتة

تصدير خرائط Openlayers برمجيًا إلى ملف صورة ثابتة


بقدر ما أفهم هذا المثال من صفحة OpenLayers وكود المصدر المرتبط لهذا المثال ، فإن OpenLayers3 لديه الآن القدرة الرسمية على حفظ الخرائط كملفات صور ثابتة.

ومع ذلك ، يتم الحفظ عبر زر على موقع الويب (وأنا لا أفهم تمامًا كيف أنني لست كثيرًا في جافا سكريبت).

هل هناك أيضًا إمكانية للقيام بذلك بشكل برمجي بالطريقة التالية؟

  1. إنشاء صفحة ويب برمجيًا باستخدام خريطة OpenLayers3 مضمنة ، مع عرض البيانات من أي مصادر
  2. تصدير قماش صفحة الويب (كل الطبقات التي سيتم عرضها عند فتح الصفحة في المستعرض) في ملف صورة ثابتة

أعتقد أن إنشاء صفحة الويب لن يكون بهذه الصعوبة. ومع ذلك ، فإن السؤال هو أكثر حول ما إذا كان من الممكن استخدامتصديربدون زر قابل للنقر ولكن عن طريق استدعائه عبر برنامج نصي أو سطر أوامر أو ما شابه.

لقد أجريت بعض الاختبارات باستخدام هذا الأسلوب باستخدام PhantomJS لحفظ لقطة شاشة لصفحة الويب. ومع ذلك ، لم أتمكن بعد من تشغيل هذا بشكل صحيح (لم يتم العثور على كائن الخريطة من صفحة الويب الخاصة بي ، وعند العثور عليه ، يبدأ التقديم قبل تحميل جميع المربعات ، ويتم تجاهل معلمات الحجم.


إزالة تبعية OpenLayers3 من العنوان ، نرحب أيضًا بالحلول التي تستخدم OpenLayers2.


هل تستخدم GeoServer كخلفية؟
يمكنك بناء ملف GetMap اطلب عبر JavaScript واستخدم ملف احصل على HTML طلب الحصول على تلك الصورة.
أستخدم نفس الأسلوب لتضمين الخرائط الثابتة برمجيًا في التقارير في Ms-Access.
تعديل:
أستخدم PostgreSQL لتخزين بياناتي ، ويتولى GeoServer عرض هذه البيانات وتقديمها.
لتضمين خرائط ثابتة في تقارير Ms-Access ، أحصل أولاً على BoundingBox للمنطقة التي أريد خريطة لها. يتم ذلك فقط في SQL عبر وظيفة مخصصة للاستعلام عن قاعدة بيانات PostgreSQL الخاصة بي.
يمكنك الحصول على نفس الإجابات باستخدام رأ وطرقها (على سبيل المثال ol.extent.getBottomLeft ()) للحصول على BoundingBox الخاص بك.
إليك كود VBA الخاص بي الذي ينشئ الطلب.

GetMapString = "http: //" + GeoServerHost + "/geoserver/wms؟request=GetMap&service=WMS&version=1.1.3" & _ "& layer =" + GeoServerWorkspace + ":" + LayerName & _ "& styles =" & _ " & srs = EPSG: 27700 "& _" & bbox = "& x1 &"، "& y1 &"، "& x2 &"، "& y2 & _" & width = 1200 & height = 1200 "& _" & format_options = dpi: 300؛ antialiasing: on "& _" & format = image٪ 2Fpng8 "

يجب أن يؤدي إنشاء GetMapString مكافئ في JavaScript ، ثم إرسال ذلك مع طلب HTML GET ، إلى إرجاع صورة PNG8.
تأكد من التحقق من معلمة SRS وتغييرها حيث من المحتمل أنك لا تريد عرض صورتك في الشبكة الوطنية البريطانية.


تعمل الطريقة التالية بالنسبة لي لحفظ الخرائط الثابتة إلى ملفات png من صفحة ويب مع خريطة OpenLayers2 مضمنة (لا أرى أي سبب يمنعها من العمل مع OpenLayers3 رغم ذلك).

تعتمد الكود التالي على المثال الوارد في http://acuriousanimal.com/blog/tag/phantomjs/. لقد قمت بتعديله قليلاً لدمج الكود الذي قدمه المستخدم cjoudrey على GitHut / Gist. كان هذا هو أفضل نهج عمل وجدته لجعل phantomJS ينتظر تحميل الصفحة الكاملة (بما في ذلك جميع البيانات الجغرافية ومربعات الخرائط) قبل حفظ الخريطة في ملف صورة - وإلا ، فغالبًا ما يحصل المرء على صورة مع البيانات الجغرافية المرسومة بدون بلاط خريطة الأساس. إلى جانب ذلك ، فضلت ترميز المعلمات الضرورية بدلاً من تمريرها من سطر الأوامر.

  1. قم بتثبيت phantomJS على نظامك كما هو موضح في الصفحة الرسمية. phantomJS عبارة عن مجموعة متصفح بدون رأس تتيح لك الوصول إلى صفحات الويب من سطر الأوامر دون أي واجهة مستخدم رسومية ، والتحكم في التنقل في صفحة الويب باستخدام ملف JavaScript. علاوة على ذلك ، يحتوي على وظيفة عرض تتيح لك حفظ لقطات شاشة إما من صفحات ويب كاملة أو من عناصر HTML محددة فقط.

  2. قم بإنشاء ملف JavaScript التالي (تسميته على سبيل المثالdownload.js) وتأكد من تعديل الأسطر الثلاثة الأولى وفقًا لصفحة الويب التي تريد الاستعلام عنها.معرف الخريطةبالعودة الىقسم على صفحة الويب الخاصة بك يتضمن خريطة OpenLayers ، على التوالي إلى المعرف المستخدم في مُنشئ الخريطة ، على سبيل المثالvar map = new OpenLayers.Map ("mymapid") ؛.

download.js:

// تعديل هذه المعلمات وفقًا لذلك! var url = 'http: // localhost: 8000 / OL.html' ؛ var mapID = 'mymapid' ؛ var outputFilename = 'map.png "> كما هو موضح في الصفحة الرئيسية. ابدأ في غلاف الأوامر ، وانتقل إلى المجلد حيث يتم تخزين ملفاتك واكتبpython -m http.server(Python 3.x) أوpython -m SimpleHTTPServer(Python 2.x). بعد ذلك ، يمكنك الوصول إلى ملفك عبرhttp: // localhost: 8000 / OL_testpage.html

عيوب هذا النهج: على حد علمي ، فإن هذا النهج له عيبان. 1. يتم عرض الصورة بالحجم الصحيح فقط إذا تم إنشاء الخريطة بالعرض والارتفاع المعينين بالبكسل المطلق (كما في المثال أعلاه ، الخطوطالعرض: 1600 بكسل ؛والارتفاع: 1200 بكسل ؛). إذا تم إعطاء العرض والارتفاع كنسبة مئوية من نوافذ المتصفح كما يفعل العديد من الأشخاص (على سبيل المثالالعرض: 100٪؛) ثم تكون الصورة الناتجة صغيرة جدًا ولها بعض التنسيق التربيعي. 2. عمل استخدام phantomJS بشكل جيد بالنسبة لي عند تطبيقه على الخرائط ذات الميزات القليلة إلى حد ما. ما زلت أجرب تنفيذ ذلك على الخرائط التي تحمل عددًا كبيرًا من الميزات في طبقة متجه (على سبيل المثال ، شبكة شارع بها 900 ألف خط). هذا يجعل phantomJS يتعطل في كل مرة.


تصدير خرائط Openlayers برمجيًا إلى ملف صورة ثابتة - أنظمة المعلومات الجغرافية

أنا رجل GIS الوحيد (بدأ الأسبوع الماضي ، متلازمة المحتال حقيقية. تعلمت على ArcGIS لكنني أستخدم ArcPro / AGOL) وأريد إتاحة الخرائط لزملائي في العمل حتى يتمكنوا من عرض جداول البيانات والأشياء ، بدلاً من إعطائهم ثابتة ملفات PDF. لدي برنامج ArcPro و AGOL. اعرف ما هو المستوى ولكن يمكنني إنشاء خرائط هناك ولكن لا يمكنني نشر طبقات الويب من ArcPro ، إذا كان ذلك يمنحك تلميحًا.

لقد أنشأت مجموعة في AGOL وأردت أن أجعل زملائي في العمل يقومون بإنشاء حسابات AGOL فقط للانضمام إلى المجموعة وعرض الخرائط لا داعي لإنشاء أشياء. لا أعرف ما هي البيانات العامة أم لا ، لذلك أردت إخفاءها خلف مجموعة وإخبار الأشخاص الذين أعرفهم بها. ومع ذلك ، يبدو أنهم بحاجة إلى نسخة مدفوعة من AGOL فقط للانضمام إلى مجموعتي وعرضها؟ يبدو أن السماح لهم بعرض الأشياء في مجموعة AGOL الخاصة بي هو الخيار الأنظف ولكن الحصول على حساب أو حساب مشترك لكل منهم إذا كانت هناك تكلفة قد يكون مشكلة.

إذا كنت أعرف أن البيانات عامة ، فهل يمكنني عمل خريطة على AGOL يمكن الوصول إليها من قبل الأشخاص الذين ليس لديهم حساب مدفوع / دون تسجيل الدخول ، أو أن القدرة على عرض جميع محتويات AGOL ذات نظام حظر الاشتراك غير المدفوع تتطلب حسابًا مدفوعًا من نوع ما؟

هل هناك أي بدائل جيدة لـ AGOL مثل Google Earth / Maps؟

1) هل يمكنني السماح لزملائي في العمل بمشاهدة الخرائط في مجموعة AGOL الخاصة بي بأي نوع من أنواع حسابات AGOL المجانية (ليست نسخة تجريبية)؟

2) هل يمكنني عمل خرائط AGOL مع بيانات غير حساسة يمكن عرضها للجميع حتى بدون حسابات AGOL؟

3) بدائل AGOL ، وهل لديهم خيار بالنسبة لي للتحكم في من يمكنه الوصول إلى الخرائط هناك إذا كنت بحاجة إلى استخدام بيانات ليست عامة؟


شاهد الفيديو: Openlayers 6 Tutorial #6 - Layer Switcher