Почему это происходит (странность с Processing и UnfoldingMaps) - PullRequest
2 голосов
/ 07 февраля 2020

В рамках курса UCSD Java мы работаем с библиотеками Обработка и развертывание карт.

Курс предоставляет вам стартовый код, который я пытаюсь расширить. Но я столкнулся с проблемой.

На моем рабочем компьютере, где я в основном учусь, у меня действительно хорошее приложение запущено. Я решил отнести его домой к своей жене, чтобы показать ей, клонировав репозиторий github на свой домашний ноутбук.

Ни один из файлов librar / JAR не был включен, поэтому я загрузил их непосредственно со страниц загрузки Обработка и развертывание , Результатом была НОЧЬ. Ошибка за ошибкой за ошибкой. Я предполагаю, что Coursera / UCSD использовали старые версии библиотек, а новые версии не имеют обратной совместимости. Кажется дерьмовым, но что угодно.

Затем я загрузил все файлы JAR с поля Coursera. Результаты немного лучше, но все еще довольно странно. А именно, когда я создаю объект UnfoldingMap(), параметры местоположения в окне, а также размер абсолютно ничего не делают.

1.) Я использую метод Processing size(), чтобы увеличить или уменьшить размер содержащего окна, он масштабирует объект карты вверх или вниз. Он полностью игнорирует аргументы размера и местоположения UnfoldingMap().

2.) Объект карты всегда помещается в левый нижний угол окна, независимо от того, являются ли он аргументами для позиции.

3.) Выбранный мной серый цвет background() отображается вокруг карты, но сам фон затем окружается большим черным полем, которое также масштабируется с параметрами size().

Вот код:

package module3;

//Java utilities libraries
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

//Processing library
import processing.core.PApplet;

//Unfolding libraries
import de.fhpotsdam.unfolding.UnfoldingMap;
import de.fhpotsdam.unfolding.marker.Marker;
import de.fhpotsdam.unfolding.data.PointFeature;
import de.fhpotsdam.unfolding.marker.SimplePointMarker;
import de.fhpotsdam.unfolding.providers.Google;
import de.fhpotsdam.unfolding.providers.MBTilesMapProvider;
import de.fhpotsdam.unfolding.utils.MapUtils;

//Parsing library
import parsing.ParseFeed;

public class EarthquakeCityMap extends PApplet {

    // Less than this threshold is a light earthquake
    public static final float THRESHOLD_MODERATE = 5;
    // Less than this threshold is a minor earthquake
    public static final float THRESHOLD_LIGHT = 4;

    // This is where to find the local tiles, for working without an
        // Internet connection 
    public static String mbTilesString = "blankLight-1-3.mbtiles";

    // The map
    private UnfoldingMap map;

    //feed with magnitude 2.5+ Earthquakes
    private String earthquakesURLweek = "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.atom";
        private String earthquakesURLday = "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.atom";

    public void setup() {
            size(400, 400, "processing.opengl.PGraphics3D");
            background(99);

            map = new UnfoldingMap(this, 50, 50, 1100, 700, new Google.GoogleMapProvider());
        map.zoomToLevel(2);
        MapUtils.createDefaultEventDispatcher(this, map);   

        //List of markers to be added to map
        List<Marker> markers = new ArrayList<Marker>();

        //Use parser to collect properties for each earthquake
        //PointFeatures have a getLocation method
        List<PointFeature> earthquakes = ParseFeed.parseEarthquake(this, earthquakesURLweek);

            // for each earthqauke feature, create a custom marker and add it
            // to the list.
            for (PointFeature quake : earthquakes){
                Marker quakeMark = createMarker(quake);
                markers.add(quakeMark);
                Map<String, Object> properties = quakeMark.getProperties();
            }

        // Add the markers to the map so that they are displayed
        map.addMarkers(markers);
    }

        /**
         * A helper method to style markers based on features (magnitude, depth,
         * etc) of an earthquake.
         * @param feature A PointFeature object representing a single earthquake.
         * @return 
         */
    private SimplePointMarker createMarker(PointFeature feature){  

            // Create a new SimplePointMarker at the location given by the PointFeature
            SimplePointMarker marker = new SimplePointMarker(feature.getLocation(), feature.getProperties());

            Object magObj = feature.getProperty("magnitude");
            Object ageObj =  marker.getProperty("days ellapsed");
            float mag = Float.parseFloat(magObj.toString());
            int age = (int) ageObj;

            //Set processing color and alpha data, for setting marker colors 
            //below.
            int alpha = 255 - (age * 255 / 7);
        int yellow = color(255, 255, 0, alpha);
            int red = color(255, 0, 0, alpha);
            int green = color(0, 255, 0, alpha);

            // Style markers based on earthquake magnitude
            if (mag < THRESHOLD_LIGHT){
                marker.setColor(green);
            }
            if (mag >= THRESHOLD_LIGHT && mag < THRESHOLD_MODERATE){
                marker.setColor(yellow);
            }
            if (mag >= THRESHOLD_MODERATE){
                marker.setColor(red);
            }

            //set radius of marker based on quake magnitude
            float radius = (float) (mag * 3.5);
            marker.setStrokeColor(color(50,15));
            marker.setRadius(radius);

        return marker;
    }

    public void draw() {
        map.draw();
        addKey();
    }

1 Ответ

3 голосов
/ 07 февраля 2020

Самый простой вариант - использовать устаревшую версию Processing, которую Unfolding по-прежнему поддерживает, например Unfolding 0.9.6 (для Processing 2.2.1) .

Поскольку вы используете eclipse, вы можете на самом деле компиляция новой версии может работать для вас. (Я замечаю, что есть несколько незначительных обновлений с прошлого года, но выпуска нет). Чтобы обновить через eclipse, вы можете:

  1. получить репозиторий (если вы работаете в системе Unix (Linux / OSX), возможно, у вас уже установлена ​​git: git clone https://github.com/tillnagel/unfolding: так Вы всегда можете получить последние обновления и легко перестроить, в противном случае загрузите zip, unzip, et c.)
  2. импортируйте проект в eclipse (через Import Existing Project)
  3. Перетащите сборку. xml из проекта в Просмотр муравьев и выберите цель для компиляции. main скомпилирует все из них, включая оболочку Processing.

Если вы хотите использовать только командную строку:

  1. Install Ant (если его нет в вашей системе) и добавьте его в переменную окружения PATH (например, чтобы проверить echo $PATH на Unix или echo %PATH% на Windows и убедиться, что папка, в которой живет муравей, указана, если она не добавлена )
  2. клонировать / загрузить репозиторий
  3. запустить муравей (например, ant unfolding_processing, чтобы создать только оболочку Обработки, или просто ant (по умолчанию цель main строит все)

Я могу подтвердить ручную компиляцию последней версии из github, работающей с Processing 3.4 centre of earthquakes in Romania

Я загрузил Оболочку обработки здесь : Надеюсь, вы можете перетащить файл .jar поверх вашего проекта Eclipse.

...