יום שישי, אוקטובר 23, 2015

שירות מיפוי פרטי

לפני כשנה עבדתי עם מישהוא על הצגת פריטים על מפה,לצערי איבדתי את קוד המקור אם היה כזה (ואני גם לא זוכר ביחד עם מי עשיתי את העבודה).לכן התחלתי מסקראטצ' הפעם - לצערי אינני יודע את הapi של mapi לכן התחלתי מבנייה משרת מיפויי מקומי ע"ג דביאן (אם משהוא מכיר את המבנה וה api שלהם זה יהיה גדול אם הוא יפרסם זאת).


שרת המיפוי משתמש ב mapnik ואני טוען קבצי pbf, כמות המקום הפנויי הדרוש לבניית מערכת בצורה גסה הם כ -32 מ"ב מקום פנויי עבור כל מ"ב של קובץ נטען. לצערי גיליתי בצורה הרעה שאתה לא יכול לטעון כמה אזורים מקבצים שונים קודם כל יש לאחד אותם ורק אז ניתן יהיה לטעון. אז כבוחרים אזור צריך לחשוב טוב טוב. זמן טעינה הוא כ שעתיים לכל ג"ב של מידה (16 ג"ב ראם וכונן SSD) , המפות מרונדרות בעת הבקשה.

שרת המיפויי שלי רץ תחת אפאצי, מבצע הזדהות באמצעות שם משתמש וסיסמה ומגביל גישה לפי אזור גאוגרפי בעל חותמת SSL עם CA פרטי.

מודל המיפוי (mod_tile) מספק שירות תחת geo.

שרת ה מיפויי נקרא geo.local כל לקוח שמחובר לענני מקבל זאת דרת שרת ה DNS הפרטי שלי, אבל מכשירים שאינם מחוברים (נמצאים רק ב VPN בעלי קישור בקובץ hosts).

הגבלת אזור גאוגרפי ע"י $CC הוא סימון המדינה
iptables -A OUTPUT -m geoip --dst-cc $CC -j ACCEPT
iptables -A INPUT -m geoip --src-cc $CC -j ACCEPT




ובתור גיק מצויי, החלטתי שאני רוצה שאפליקציית המיפוי החביבה עלי (marble) תוכל לעבוד עם זה.
(לגרסת האנדרויד לחץ כאן לדיווח באגים לחץ כאן וכן יש גם גירסה לוינדוס)

יצרתי לי קובץ dgml שאיתו אוכל לגרום ל marble לעבוד עם שרת המיפויי האישי שלי  :

הקובץ שמור תחת /usr/share/marble/data/maps/earth/private

יצרתי תמונת private.png ו קובץ תחת 0/0.

אני שם פה רישיון של openstreetmap בגלל שטענתי קובץ pbf שיוצר ע"י openstreetmap.
שם המשתמש הוא tileusername והסיסמה היא  tilepassword.
 לקח לי קצת זמן להבין אבל אם הסיסמה שגוייה או המסלול ממנו צריך לקחת קבצים לא תהיה אינדיקציה ברורה.



<?xml version="1.0" encoding="UTF-8"?>
<!--
     This xml file is free software licensed under the GNU LGPL. You can
     find a copy of this license in LICENSE.txt in the top directory of
     the source code.
-->
<dgml xmlns="http://edu.kde.org/marble/dgml/2.0">
  <document>
    <head>
      <!-- The license here applies to the actual map content, not this dgml file. See the license header above for the dgml file license -->
      <!-- The content that this license refers to is not distributed with this package -->
      <license short="© OpenStreetMap contributor">Source: © OpenStreetMap contributors, License: Creative Commons Attribution-ShareAlike 2.0 (CC BY-SA)</license>
      <name>Private tile server</name>
      <target>earth</target>
      <theme>private</theme>
      <icon pixmap="private.png"/>
      <visible>true</visible>
      <description><![CDATA[<p>A <i>privately owned tile server</i></p>]]></description>
      <zoom>
        <minimum>   900  </minimum>
        <maximum>  3500  </maximum>
        <discrete> true </discrete>
      </zoom>
    </head>
    <map bgcolor="#000000">
      <canvas/>
      <target/>
      <layer name="private" backend="texture">
        <texture name="mapnik_data" expire="31536000">
          <sourcedir format="PNG"> earth/private </sourcedir>
          <tileSize width="256" height="256"/>
          <storageLayout levelZeroColumns="1" levelZeroRows="1" maximumTileLevel="19" mode="Custom"/>
          <projection name="Mercator"/>
          <downloadUrl 
protocol="https" 
host="geo.local" 
port="8080" 
path="/geo/{zoomLevel}/{x}/{y}.png" 
user="tileusername" 
password="tilepassword"/>
          <downloadPolicy usage="Browse" maximumConnections="20"/>
          <downloadPolicy usage="Bulk" maximumConnections="2"/>
        </texture>
     </layer>
      <layer name="standardplaces" backend="geodata">
        <geodata name="cityplacemarks">
          <sourcefile>cityplacemarks.cache</sourcefile>
        </geodata>
        <geodata name="baseplacemarks">
          <sourcefile>baseplacemarks.cache</sourcefile>
        </geodata>
        <geodata name="elevplacemarks">
          <sourcefile>elevplacemarks.cache</sourcefile>
        </geodata>
        <geodata name="otherplacemarks">
          <sourcefile>otherplacemarks.cache</sourcefile>
        </geodata>
        <geodata name="boundaryplacemarks">
          <sourcefile>boundaryplacemarks.cache</sourcefile>
        </geodata>
      </layer>
    </map>
    <settings>
      <property name="coordinate-grid">
        <value>true</value>
        <available>true</available>
      </property>
      <property name="overviewmap">
        <value>true</value>
        <available>true</available>
      </property>
      <property name="compass">
        <value>true</value>
        <available>true</available>
      </property>
      <property name="scalebar">
        <value>true</value>
        <available>true</available>
      </property>
      <group name="Places">
        <property name="places">
          <value>true</value>
          <available>true</available>
        </property>
        <property name="cities">
          <value>false</value>
          <available>false</available>
        </property>
        <property name="terrain">
          <value>false</value>
          <available>false</available>
        </property>
        <property name="otherplaces">
          <value>false</value>
          <available>false</available>
        </property>
      </group>
      <group name="Texture Layers">
        <property name="hillshading">
          <value>false</value>
          <available>true</available>
        </property>
      </group>
    </settings>
    <legend>
      <section name="coordinate-grid" checkable="true" connect="coordinate-grid" spacing="12">
        <heading>Coordinate Grid</heading>
      </section>
    </legend>
  </document>
</dgml>

למעשה אני אישית עדיין מנסה להבין איך עובדים עם המפות של מפי, ניסיתי לחפור אבל לא הצלחתי למצוא את הלוגיקה בהם הם מחלקים את המפות (ולא איך אני מתממשק מולם) . 

אין תגובות:

הוסף רשומת תגובה