Google मानचित्र और JavaFX: JavaFX बटन पर क्लिक करने के बाद मानचित्र पर डिस्प्ले मार्कर


359

जब मैं अपने JavaFX एप्लिकेशन के एक बटन पर क्लिक करता हूं, तो मैं मानचित्र पर एक मार्कर प्रदर्शित करने की कोशिश कर रहा हूं। तो क्या होता है जब मैं उस बटन पर क्लिक करता हूं, तो मैं एक JSON फ़ाइल में स्थिति लिखता हूं, यह फ़ाइल उस HTML फ़ाइल में लोड की जाएगी जिसमें नक्शा शामिल है। समस्या यह है कि यह पूरी तरह से काम करता है जब मैं ब्राउज़र में HTML पृष्ठ खोलता हूं, लेकिन जावाएफएक्स के वेब दृश्य में कुछ भी नहीं होता है, और मुझे पता है कि क्यों!

यह HTML फ़ाइल है:

<!DOCTYPE html>
<html>
  <head>
  <title>Simple Map</title>
  <meta name="viewport" content="initial-scale=1.0">
  <meta charset="utf-8">
  <style>
  /* Always set the map height explicitly to define the size of the div
   * element that contains the map. */
  /*#map {
    height: 100%;
  }*/
  #map{width:100%;height:100%;margin:auto;}
  /* Optional: Makes the sample page fill the window. */
  html, body {
    height: 100%;
    margin: 0;
    padding: 0;
  }
</style>
</head>
<body>
<div id="map"></div>
<script>
  var map;
  var marker;
  // Multiple Markers
  var markers = [];
  var pos = {lat: 46.662388, lng: 0.3599617};
  var itinerary_markers = [];

  function initMap() {

    var currentLat, currentLng;//Latitude et longtitude courante

    $.ajax({
      url: 'https://maps.googleapis.com/maps/api/geocode/json?address=My+ADDRESS&key=MY_KEY',
      async: false,
      dataType: 'json',
      success: function (data) {
        currentLat = data.results[0].geometry.location.lat;
        currentLng = data.results[0].geometry.location.lng;
      }
    });

    map = new google.maps.Map(document.getElementById('map'), {
      center: {lat: currentLat, lng: currentLng},
      zoom: 15,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });


    /*MARQUEUR*/ 
    $.ajax({
        async: false,
        url: 'test.json',
        data: "",
        accepts:'application/json',
        dataType: 'json',
        success: function (data) {
            for (var i = 0; i < data.hydrants.length; i++) {
                markers.push( data.hydrants[i]);
            }
        }
    });

      var posi = new google.maps.LatLng(markers[0].Lat, markers[0].Lng);
      marker = new google.maps.Marker({
          position: posi,
          map: map,
          //title: markers[i][0]
          title: markers[0].Name
        });

  }
</script>

<script
    src="https://code.jquery.com/jquery-3.2.1.min.js"
    integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
    crossorigin="anonymous">
</script>


<script src="https://maps.googleapis.com/maps/api/js?key=MY_KEY&callback=initMap&language=fr"
async defer></script>

</body>
</html>

जब मैं बटन पर क्लिक करता हूं, तो मैं JSON फाइल (जो पूरी तरह से काम करता है) को भरता हूं और फिर मैं इसे वेबव्यू को रिफ्रेश करने के लिए निष्पादित करता हूं:

this.webView.getEngine().load(getClass().getResource("/data/index.html").toString());

जैसा कि मैंने पहले कहा था, जब मैं उस ब्राउज़र पर फ़ाइल खोलता हूं जिसे मैं अपेक्षित परिणाम देखता हूं, लेकिन मुझे नहीं पता कि JavaFX के साथ क्या समस्या है। अगर ऐसा करने का कोई बेहतर तरीका है तो कृपया मुझे बताएं।

संपादित करें:

मुझे JavaFX से जावास्क्रिप्ट (निष्पादन) (विधि) का उपयोग करके सीधे डेटा (जीपीएस निर्देशांक) भेजकर समस्या का हल मिल गया, इसलिए मुझे दो प्लेटफार्मों के बीच पुल के रूप में एक json फ़ाइल की आवश्यकता नहीं है। तो यह एक उदाहरण है कि कोड कैसा दिखता है:

eng.executeScript("updateMarker(" + lat + ", " + lng + ")");//eng is a WebEngine instance

और यहाँ जावास्क्रिप्ट है:

/*The initial latitude and longtitude*/
var currentLat = the latitude;
var currentLng = the longtitude;

function initMap() {

    map = new google.maps.Map(document.getElementById('map'), {
      center: {lat: currentLat, lng: currentLng},
      zoom: 15,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    var posi = new google.maps.LatLng(currentLat, currentLng);
    marker = new google.maps.Marker({
        position: posi,
        map: map,
        visible: false
    });
  }

/*The method that is I call from JavaFX*/
function updateMarker(_lat, _lng){
    marker.setPosition({lat: _lat, lng: _lng});
    map.setCenter(new google.maps.LatLng(_lat, _lng));
    marker.setVisible(true);
  }

आपकी टिप्पणियों और उत्तरों के लिए धन्यवाद, और रेडिट के लिए एक विशेष गोलीबारी।



1
हालांकि स्क्रिप्ट संभव तरीके से नहीं लिखी गई है, लेकिन इसमें कुछ भी गलत नहीं है। कुछ संभावनाएं हैं जो इसे काम नहीं कर सकती हैं। सुनिश्चित करें कि नया मार्कर json फ़ाइल के शीर्ष पर जोड़ा गया है। cache: falseकैश होने की स्थिति में अजाक्स कॉल को पास करें, और सुनिश्चित करें कि आपने सही फ़ाइल को लक्षित किया है। इसके अलावा कुछ लॉग यहां और समस्या की पहचान करने में मदद करेंगे।
गोचन कर्ट

1
क्या ऐसा हो सकता है, कि JavaFX चीज को आपके टेस्ट जैसे गैर-HTTP सर्व किए गए एंडपॉइंट्स से कॉल / डेटा प्राप्त करने के लिए ajax का उपयोग करने में समस्याएँ हैं।
सेबेस्टियन

@ सेबैस्टियन व्हाट्सएप ड्राइविंग मुझे क्रेजी करता है कि जब मैं ऐप खोलता हूं तो json फाइल सही तरीके से लोड होती है और मुझे अपेक्षित परिणाम दिखाई देता है। समस्या यह है कि जब मैं एक और मान के साथ जसन फ़ाइल को अपडेट करता हूं (जब एप्लिकेशन खुला होता है) तो यह सिर्फ नए मार्कर को प्रदर्शित करने के लिए ताज़ा नहीं करना चाहता है! तो अजाक्स कॉल के साथ कोई समस्या नहीं है। लेकिन क्या यह कॉलबैक की बात हो सकती है? क्योंकि initMap () पृष्ठ लोड होने के दौरान कहा जाता है
चैंडलर बिंग

@ GökhanKurt क्या आप ऊपर का जवाब पढ़ेंगे
चैंडलर बिंग

जवाबों:


70

अगर मुझे अनुमान लगाना होता है - दो चीजों में से एक है:

या तो ए) आपका जावाएफएक्स क्रॉस साइट अजाक्स कॉल का समर्थन नहीं कर रहा है या बी) यह अतुल्यकालिक अजाक्स प्रतिक्रिया की प्रतीक्षा नहीं कर रहा है / कुछ और गलत हो रहा है।

तो चलो कुछ परीक्षण एक साथ करते हैं। सबसे पहले हम इस ajax कॉल घोंसला करने के लिए साफ कर सकते हैं? तो फिर तुम कुछ दिलासा जोड़ सकते हैं। बयान में यह पता लगाने के लिए कि प्रत्येक क्या वापस भेज रहा है? अगर आपको कुछ आउटपुट याद आता है तो हमें पता है कि यह कहाँ गलत है और इससे हमें चीजों को ठीक करने में मदद मिलेगी।

नोट: मैंने सफलता को 'किए गए' परिवर्धन में बदल दिया है क्योंकि सफलता थोड़ी बाहर है, और इस सवाल को खत्म करने के लिए सब कुछ नेस्टेड है कि क्या किसी भी खाली को अगली कॉल में भेजा जा रहा है (तुल्यकालन मुद्दे):

$.ajax({
    url: 'https://maps.googleapis.com/maps/api/geocode/json?address=My+ADDRESS&key=MY_KEY',
    async: false,
    dataType: 'json'
}).done(function(data) {
    currentLat = data.results[0].geometry.location.lat;
    currentLng = data.results[0].geometry.location.lng;
    console.log(currentLat);
    console.log(currentLng);
    // Multiple Markers
    var markers = [];
    var pos = {lat: 46.662388, lng: 0.3599617};
    var itinerary_markers = [];
    var map = new google.maps.Map(document.getElementById('map'), {
        center: {lat: currentLat, lng: currentLng},
        zoom: 15,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });
    console.log(map);
    /*MARQUEUR*/ 
    $.ajax({
        async: false,
        url: 'test.json',
        data: "",
        accepts:'application/json',
        dataType: 'json'
    }).done(function(data) {
        for (var i = 0; i < data.hydrants.length; i++) {
            markers.push( data.hydrants[i]);
        }
        console.log(markers);
        var posi = new google.maps.LatLng(markers[0].Lat, markers[0].Lng);
        console.log(posi);
        var marker = new google.maps.Marker({
            position: posi,
            map: map,
            //title: markers[i][0]
            title: markers[0].Name
        });
        console.log(marker);
    }).fail(function(jqXHR, testStatus){
        console.log(textStatus);
    });
}).fail(function(jqXHR, testStatus){
    console.log(textStatus);
});

यहाँ जावा में System.out में कंसोल.लॉग आउटपुट प्राप्त करने पर एक लिंक दिया गया है अगर यह एक मुद्दा है: JavaFX 8 WebEngine: कैसे जावा में जावास्क्रिप्ट से सिस्टम.आउट के लिए कंसोल.लॉग () प्राप्त करें?

... साथ ही रेडिट से हैलो।


नमस्ते वहाँ, तो आपको लगता है कि समस्या AJAX कॉल के साथ है। ठीक है, मैं जावास्क्रिप्ट (जीपीएस का उपयोग करके) को भेजने के लिए एक और तरीका खोजने की कोशिश करूँगा (निष्पादन का उपयोग करके)।
चैंडलर बिंग

नहीं, इसके अजाक्स कॉल नहीं। समस्या यह है कि नए मार्कर को दिखाने के लिए मैं वेबव्यू को रिफ्रेश नहीं कर सकता। जब मैं एप्लिकेशन खोलता हूं, तो मानचित्र प्रदर्शित होता है जिसका अर्थ है कि अजाक्स कॉल ठीक काम करता है।
चैंडलर बिंग

18

कतार में:

this.webView.getEngine().load(getClass().getResource("/data/index.html").toString());

मैं कोशिश करूँगा कि फ़ाइल की राह को डबल-चेक करना सही है। StackOverflow पर अन्य उत्तरों को पढ़ते हुए, ऐसा लगता है कि यह पैकेज रूट के सापेक्ष होना चाहिए और या तो अग्रणी / 'के साथ या उसके बिना होना चाहिए। यानी getResource("data/index.html")। लेकिन, फिर, शायद आप पहले से ही त्रुटियों को देख रहे होंगे getResource()...

डिबगिंग के उद्देश्यों के लिए मेरा अगला काम है, उस हिस्से पर टिप्पणी करना, जहां आप JSON लिखते हैं और मैन्युअल रूप से कुछ अच्छा JSON लिखते हैं और बस इसे WebView में दिखाने का प्रयास करते हैं। कम चलने वाले हिस्से, बेहतर। यदि आप इसे अपने पूर्व-लिखित JSON के साथ काम करने के लिए प्राप्त कर सकते हैं तो आप मान सकते हैं कि यह JSON आपके द्वारा लिखे जा रहे जावा के साथ कुछ समस्या है और फिर इसे HTML में लोड किया जा रहा है।

संपादित करें: मैं थोड़ा गहरा खोदा। यह फिर से पूरी तरह से गलत हो सकता है, लेकिन शायद आप initMap()जावा से फ़ंक्शन को मैन्युअल रूप से कॉल करने का प्रयास कर सकते हैं जो आपके वेब ब्राउज़र को सामान्य रूप से ऑनलोड कहते हैं। बटन पर एक JavaFX WebView से जावास्क्रिप्ट फ़ंक्शन कैसे कॉल करें? कुछ और विवरण हैं। this.webView.getEngine().executeScript("initMap()");अपने बटन के साथ JSON को संपादित करने के बाद प्रयास करें।

संपादित 2 एक तरफ के रूप में भी, यह नक्शा बनाने के लिए और फिर मानचित्र पर मार्करों को स्थापित करने के लिए initMapएक initMapऔर updateMapसमारोह में विभाजित करने के लिए समझ में आ सकता है । हालांकि यह शायद ही कोई तोड़ रहा हो।


कोई समस्या नहीं है, मैं जब मैं एप्लिकेशन खोलता हूं तो मैं उस लाइन को असाइन करता हूं। लेकिन जब मैं एक बटन पर क्लिक करता हूं, तो मैं मानचित्र पर एक मार्कर डालना चाहता हूं। लेकिन मैं उस पर मार्कर दिखाने के लिए नक्शे को ताज़ा नहीं कर सकता।
चैंडलर बिंग

1
आह, गच्चा। मैंने गलत समझा। क्या आप कह रहे हैं कि मूल पृष्ठ लोड हो रहा है लेकिन कोई मार्कर लोड नहीं हो रहा है? क्या मानचित्र आपके वेबव्यू में कम से कम दिखाई दे रहा है? मुझे लगता है कि जैसा कि आपने ऊपर initMap उल्लेख किया है, आप कुछ पर हो सकते हैं। यदि यह केवल पेज लोड पर उस फ़ंक्शन को कॉल कर रहा है, तो संभवत: इसे संपादन नहीं मिल रहा है। आपको वेबव्यू के भीतर पृष्ठ को रीफ्रेश करना होगा या पेज को किसी भी तरह से initMap को फिर से कॉल करने के लिए बताना होगा - ajax के माध्यम से? जब तक JavaFX जावास्क्रिप्ट कार्यों को कॉल करने के लिए वेबव्यू प्राप्त कर सकता है
मैट

जब एप्लिकेशन को सब कुछ खोला जाता है जो कि json फाइल में मौजूद होता है। लेकिन जब मैं ऐप खोलते समय एक मूल्य बदल देता हूं, तो परिवर्तन देखने के लिए मैं वेबव्यू को रिफ्रेश करना चाहता हूं। लेकिन यह सिर्फ काम नहीं करता है! यही समस्या है।
चैंडलर बिंग

1
मेरा संपादन देखें - क्या initMap फ़ंक्शन सहायता के लिए जावा से मैन्युअल कॉल जोड़ना है?
मैट

4

यदि आपके माउस-व्हील का उपयोग मानचित्र को ज़ूम आउट करने के लिए किया जाता है या मार्कर दिखाई देता है, तो आप उसी समस्या का अनुभव कर रहे हैं जो मैंने किया था।

मार्करों को पुनर्स्थापित करने के लिए मैपव्यू को मैन्युअल रूप से ज़ूम करने का प्रयास करें। दिशा निर्देश सेवा से मार्ग प्रदर्शित करते समय मुझे भी इस तकनीक को नियोजित करना था, अन्यथा वेपॉइंट मार्कर सही ढंग से प्रदर्शित नहीं हो रहे थे।

ऐसा करने के लिए मेरे Javafx नियंत्रक वर्ग में यह कोड है:

KeyFrame kf1 = new KeyFrame(Duration.seconds(0.75), e -> map.setZoom(map.getZoom() - 1));
KeyFrame kf2 = new KeyFrame(Duration.seconds(1.5), e -> map.setZoom(map.getZoom() + 1));
Timeline timeline = new Timeline(kf1, kf2);
Platform.runLater(timeline::play);

यह GMapsFX का उपयोग कर रहा था, जो जावा स्क्रिप्ट वेबव्यू पर जावास्क्रिप्ट इंजन कॉल के आसपास सिर्फ एक पतला जावा आवरण है। उम्मीद है कि यह मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.