Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CustomMarker ignored and default icon not visible #336

Open
Memo99 opened this issue Aug 29, 2022 · 0 comments
Open

CustomMarker ignored and default icon not visible #336

Memo99 opened this issue Aug 29, 2022 · 0 comments

Comments

@Memo99
Copy link

Memo99 commented Aug 29, 2022

HI,

i'm trying to show the search result on the map, but either my custom marker will be shown, or the default one, because the image is not contained in the npm package. ("dist/assets/img*)

How could i solve this?

import React, { Fragment, useEffect, useState } from 'react';
import L from 'leaflet';
import { MapContainer, TileLayer, Popup, Marker, useMap } from "react-leaflet";
import { GeoSearchControl, OpenStreetMapProvider } from 'leaflet-geosearch';


import {useGeoLocation} from 'services/LocationService';
import axios from 'axios';
import "leaflet-geosearch/assets/css/leaflet.css"

var called = false; // only dev mode

const customMarker = L.icon({
    iconRetinaUrl:  process.env.PUBLIC_URL + "/assets/img/misc/marker.png",
    iconUrl: process.env.PUBLIC_URL + "/assets/img/misc/marker.png",
    iconSize: [50, 50],
    iconAnchor: [25, 5],
});

export function LocationMap(props) {
    const location = useGeoLocation();
    const ZOOM_LEVEL = 13;
    const [searchTerm, setSearchTerm] = useState('');
    const [searchResults, setSearchResults] = useState(["Istanbul", "Ankara"]);
    const provider = new OpenStreetMapProvider();
    const searchControl = new GeoSearchControl({
        provider: provider,
        style: 'bar',
        showMarker: false, // optional: true|false  - default true
        showPopup: false, // optional: true|false  - default false
        popupFormat: ({ query, result }) => result.label, // optional: function    - default returns result label,
        resultFormat: ({ result }) => result.label, // optional: function    - default returns result label
        maxMarkers: 5, // optional: number      - default 1
        retainZoomLevel: true, // optional: true|false  - default false
        animateZoom: true, // optional: true|false  - default true
        autoClose: false, // optional: true|false  - default false
        searchLabel: 'search', // optional: string      - default 'Enter address'
        keepResult: false, // optional: true|false  - default false
        updateMap: true, // optional: true|false  - default true
        marker: {
            // optional: L.Marker    - default L.Icon.Default
            icon: new L.Icon.Default(),
            draggable: false,
          },
      });

    useEffect(() => {
        const delayDebounceFn = setTimeout(() => {
            
            if(searchTerm && searchTerm.length > 0)
            {
                const result = axios.get(`https://nominatim.openstreetmap.org/search/${searchTerm}?format=json`);
                result.then((result)=> {
                    console.log(result.data);
                    setSearchResults(result.data)
                })
            }
        }, 200)

        return () => clearTimeout(delayDebounceFn);
    }, [searchTerm])

    const CurrentPos = ({loc}) => {
        const mapRef = useMap();
        if(loc.loaded && !loc.error)
            mapRef.flyTo(
                {lat:loc.coordinates.lat, lng: loc.coordinates.lng}, 
                ZOOM_LEVEL, 
                {animate: false}
            )
        if(loc.error)
        {
            alert("No location");
        }
        return null;
    }

    const SearchComp = () => {
        const map = useMap();  
        useEffect(() => {
            if(!called)
            {
                map.addControl(searchControl); 
                called = true;
            }
        }, [])
        return null;
    }

    return (
        <Fragment>
            <div className="form-group submit-listing-map">
                <MapContainer id="map" zoom={8} center={{lat: 39.924396, lng: 32.836010 }} 
                // onClick={(e) => setLocation(e.latlng)}
                >
                    <TileLayer
                        url='https://{s}.tile.osm.org/{z}/{x}/{y}.png'
                    />
                    <SearchComp />
                    <CurrentPos loc={location} />
                    {location.loaded && !location.error && (
                        <Marker icon={customMarker} position={[location.coordinates.lat, location.coordinates.lng]}></Marker>
                    )}
                </MapContainer>
            </div>
        </Fragment>
    );
    
}```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant