コード例 #1
0
ファイル: gpx.py プロジェクト: hoodycoder/django-for-runners
def generate_svg(gpx_track, force=False):
    """
    Generate SVG and save it to the given GPXModel.

    :param gpx_track: for_runners.models.gpx.GpxModel instance
    :param gpxpy_instance: gpxpy.parser.GPXParser instance
    :param force: don't check if svg track already exists
    :return: svg
    """
    if gpx_track.track_svg:
        # svg image already exists.
        if not force:
            # Don't recreate existing images
            return

    log.debug("Create SVG from GPX...")
    gpxpy_instance = gpx_track.get_gpxpy_instance()
    svg_string = gpx2svg_string(gpxpy_instance)
    content = ContentFile(svg_string)

    # https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.fields.files.FieldFile.save
    svg = gpx_track.track_svg.save(
        name="temp.svg",  # real file path will be set in self.get_svg_upload_path()
        content=content,
        save=False
    )
    log.debug("SVG created: %r" % svg)

    return svg
コード例 #2
0
    def test_svg(self):
        filepath = Path(BASE_PATH, "fixture_files/parliament_buildings.gpx")

        gpxpy_instance = parse_gpx_file(filepath)
        svg_string = gpx2svg_string(gpxpy_instance, pretty=True)
        print("-" * 79)
        print(svg_string)
        print("-" * 79)

        svg_reference = Path(BASE_PATH, "fixture_files/parliament_buildings.svg")
        with svg_reference.open("r") as f:
            svg_reference_string = f.read()

        self.assertEqual(svg_string, svg_reference_string)
コード例 #3
0
    def test_svg(self):
        filepath = Path(BASE_PATH, "fixture_files/parliament_buildings.gpx")

        gpxpy_instance = parse_gpx_file(filepath)
        svg_string = gpx2svg_string(gpxpy_instance, pretty=True)
        print("-" * 79)
        print(svg_string)
        print("-" * 79)

        svg_reference = Path(BASE_PATH, "fixture_files/parliament_buildings.svg")
        with svg_reference.open("r") as f:
            svg_reference_string = f.read()

        # Attributes in <svg ...> tag seems not to be ordered, so just compare
        # via parsed DOM-Tree ... but hey, it works ;)
        self.assertHTMLEqual(svg_string, svg_reference_string)
コード例 #4
0
ファイル: gpx.py プロジェクト: rixx/django-for-runners
    def calculate_values(self):
        if not self.gpx:
            return

        gpxpy_instance = self.get_gpxpy_instance()
        self.points_no = gpxpy_instance.get_points_no()
        self.length = gpxpy_instance.length_3d()

        try:
            ideal_distances_qs = DistanceModel.objects.filter(
                min_distance_m__lte=self.length,
                max_distance_m__gte=self.length,
            )
        except DistanceModel.DoesNotExist:
            pass
        else:
            ideal_distance_count = ideal_distances_qs.count()
            if ideal_distance_count>1:
                log.error("Found more the one ideal distances for %i Meters", self.length)
                ideal_distances_qs = ideal_distances_qs.order_by("distance_km")
                ideal_distance = ideal_distances_qs[0]
            elif ideal_distance_count==1:
                ideal_distance = ideal_distances_qs.get()
            else:
                ideal_distance = None

            if ideal_distance:
                self.ideal_distance = ideal_distance
                log.debug("Set ideal distance to %s", self.ideal_distance)

        # e.g: GPX without a track return 0
        duration = gpxpy_instance.get_duration()
        if duration:
            self.duration_s = duration
            self.calc_pace()

        uphill_downhill = gpxpy_instance.get_uphill_downhill()
        self.uphill = uphill_downhill.uphill
        self.downhill = uphill_downhill.downhill

        elevation_extremes = gpxpy_instance.get_elevation_extremes()
        self.min_elevation = elevation_extremes.minimum
        self.max_elevation = elevation_extremes.maximum

        identifier = get_identifier(gpxpy_instance)

        self.start_time = identifier.start_time
        self.finish_time = identifier.finish_time
        self.start_latitude = identifier.start_lat
        self.start_longitude = identifier.start_lon
        self.finish_latitude = identifier.finish_lat
        self.finish_longitude = identifier.finish_lon

        if not self.start_temperature:
            try:
                temperature, weather_state = meta_weather_com.coordinates2weather(
                    self.start_latitude, self.start_longitude, date=self.start_time, max_seconds=self.duration_s
                )
            except NoWeatherData:
                log.error("No weather data for start.")
            else:
                self.start_temperature = temperature
                self.start_weather_state = weather_state

        if not self.finish_temperature:
            try:
                temperature, weather_state = meta_weather_com.coordinates2weather(
                    self.finish_latitude, self.finish_longitude, date=self.finish_time, max_seconds=self.duration_s
                )
            except NoWeatherData:
                log.error("No weather data for finish.")
            else:
                self.finish_temperature = temperature
                self.finish_weather_state = weather_state

        if not self.full_start_address:
            try:
                start_address = reverse_geo(self.start_latitude, self.start_longitude)
            except Exception as err:
                # e.g.: geopy.exc.GeocoderTimedOut: Service timed out
                log.error("Can't reverse geo: %s" % err)
            else:
                self.short_start_address = start_address.short
                self.full_start_address = start_address.full

        if not self.full_finish_address:
            try:
                finish_address = reverse_geo(self.finish_latitude, self.finish_longitude)
            except Exception as err:
                # e.g.: geopy.exc.GeocoderTimedOut: Service timed out
                log.error("Can't reverse geo: %s" % err)
            else:
                self.short_finish_address = finish_address.short
                self.full_finish_address = finish_address.full

        if not self.track_svg:
            log.debug("Create SVG from GPX...")
            svg_string = gpx2svg_string(gpxpy_instance)
            content = ContentFile(svg_string)

            # https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.fields.files.FieldFile.save
            self.track_svg.save(
                name="temp.svg",  # real file path will be set in self.get_svg_upload_path()
                content=content,
                save=False
            )

        # TODO: Handle other extensions, too.
        # Garmin containes also 'cad'
        extension_data = get_extension_data(gpxpy_instance)
        if extension_data is not None and "hr" in extension_data:
            heart_rates = extension_data["hr"]
            self.heart_rate_min = min(heart_rates)
            self.heart_rate_avg = statistics.median(heart_rates)
            self.heart_rate_max = max(heart_rates)

        if not self.creator:
            self.creator = gpxpy_instance.creator