ভাগ করা ওয়েব হোস্টে প্রক্সিমিটি-ভিত্তিক স্টোরের অবস্থান অনুসন্ধানের অনুকূলকরণ?


11

আমি একটি প্রকল্প পেয়েছি যেখানে আমাকে ক্লায়েন্টের জন্য একটি স্টোর লোকেটার তৈরি করতে হবে।

আমি একটি কাস্টম পোস্ট টাইপ " restaurant-location" ব্যবহার করছি এবং আমি গুগল জিওকোডিং এপিআই ব্যবহার করে পোস্টমেটায় সঞ্চিত ঠিকানাগুলি জিওকোড করার জন্য কোডটি লিখেছি ( JSON এ মার্কিন হোয়াইট হাউসকে জিওকোড করে এমন লিঙ্কটি এখানে রেখেছি এবং আমি অক্ষাংশ এবং দ্রাঘিমাংশ পিছনে সঞ্চিত করেছি কাস্টম ক্ষেত্র।

আমি একটি get_posts_by_geo_distance()ফাংশন লিখেছি যা এই পোস্টের স্লাইডশোতে আমার পাওয়া সূত্রটি ব্যবহার করে ভৌগলিকভাবে সবচেয়ে কাছের যারা তাদের ক্রমের জন্য পোস্টগুলির একটি তালিকা প্রদান করে । আপনি আমার ফাংশনটিকে এভাবে কল করতে পারেন (আমি একটি স্থির "উত্স" ল্যাট / দীর্ঘ দিয়ে শুরু করছি):

include "wp-load.php";

$source_lat = 30.3935337;
$source_long = -86.4957833;

$results = get_posts_by_geo_distance(
    'restaurant-location',
    'geo_latitude',
    'geo_longitude',
    $source_lat,
    $source_long);

echo '<ul>';
foreach($results as $post) {
    $edit_url = get_edit_url($post->ID);
    echo "<li>{$post->distance}: <a href=\"{$edit_url}\" target=\"_blank\">{$post->location}</a></li>";
}
echo '</ul>';
return;

এখানে ফাংশনটি get_posts_by_geo_distance()নিজেই:

function get_posts_by_geo_distance($post_type,$lat_key,$lng_key,$source_lat,$source_lng) {
    global $wpdb;
    $sql =<<<SQL
SELECT
    rl.ID,
    rl.post_title AS location,
    ROUND(3956*2*ASIN(SQRT(POWER(SIN(({$source_lat}-abs(lat.lat))*pi()/180/2),2)+
    COS({$source_lat}*pi()/180)*COS(abs(lat.lat)*pi()/180)*
    POWER(SIN(({$source_lng}-lng.lng)*pi()/180/2),2))),3) AS distance
FROM
    wp_posts rl
    INNER JOIN (SELECT post_id,CAST(meta_value AS DECIMAL(11,7)) AS lat FROM wp_postmeta lat WHERE lat.meta_key='{$lat_key}') lat ON lat.post_id = rl.ID
    INNER JOIN (SELECT post_id,CAST(meta_value AS DECIMAL(11,7)) AS lng FROM wp_postmeta lng WHERE lng.meta_key='{$lng_key}') lng ON lng.post_id = rl.ID
WHERE
    rl.post_type='{$post_type}' AND rl.post_name<>'auto-draft'
ORDER BY
    distance
SQL;
    $sql = $wpdb->prepare($sql,$source_lat,$source_lat,$source_lng);
    return $wpdb->get_results($sql);
}

আমার উদ্বেগ হ'ল এসকিউএলটি যতটা অপ্রটিমাইজড হবে আপনি তা পেতে পারেন। মাইএসকিউএল কোনও উপলভ্য সূচী দ্বারা অর্ডার করতে পারে না যেহেতু উত্স জিও পরিবর্তনযোগ্য এবং ক্যাশে সোর্স জিওগুলির একটি সীমাবদ্ধ সেট নেই। বর্তমানে আমি এটির অনুকূলিতকরণের উপায়গুলিতে স্ট্যাম্পড আছি।

আমি ইতিমধ্যে যা করেছি তা বিবেচনায় রেখে প্রশ্নটি হল: আপনি কীভাবে এই ব্যবহারের ক্ষেত্রে অনুকূলিত হন?

এটির পক্ষে গুরুত্বপূর্ণ নয় যে আমি যা কিছু করেছি তা রাখি যদি এর থেকে আরও ভাল সমাধান আমাকে এড়িয়ে যায়। আমি একটি স্পিনিক্স সার্ভার ইনস্টল করার মতো কিছু করা বা কাস্টমাইজড মাইএসকিউএল কনফিগারেশন প্রয়োজন এমন কিছু করা ছাড়া প্রায় কোনও সমাধান বিবেচনা করার জন্য আমি উন্মুক্ত । মূলত সমাধানটি কোনও প্লেইন ভ্যানিলা ওয়ার্ডপ্রেস ইনস্টল করে কাজ করতে সক্ষম হওয়া প্রয়োজন। (এটি বলেছে যে, যদি কেউ অন্যদের জন্য আরও উন্নত এবং উত্তরোত্তর জন্য বিকল্প বিকল্প সমাধানের তালিকা তৈরি করতে চায় তবে এটি দুর্দান্ত হবে))

সংস্থান প্রাপ্ত

এফওয়াইআই, আমি এ নিয়ে কিছুটা গবেষণা করেছিলাম বরং আপনি পুনরায় গবেষণা করার চেয়ে বরং উত্তর হিসাবে এই লিঙ্কগুলির কোনও পোস্ট করার চেয়ে আমি এগিয়ে যাব এবং সেগুলি অন্তর্ভুক্ত করব।

স্ফিংক্স অনুসন্ধান সম্পর্কিত

উত্তর:


6

আপনার কোন নির্ভুলতা দরকার? এটি যদি কোনও রাজ্য / জাতীয় প্রশস্ত অনুসন্ধান হয় তবে আপনি জিপ লুকানোর জন্য একটি দীর্ঘস্থায়ী করতে পারেন এবং জিপ অঞ্চল থেকে রেস্তোঁরাটির জিপ অঞ্চল পর্যন্ত পূর্ববর্তী দূরত্ব রাখতে পারেন। আপনার যদি সঠিক দূরত্বের প্রয়োজন হয় তবে এটি কোনও ভাল বিকল্প হবে না।

আপনার জিওহ্যাশ সমাধানটি সন্ধান করা উচিত , উইকিপিডিয়া নিবন্ধে জিওহ্যাশ থেকে লম্বা লম্বা লম্বা লম্বা লম্বা এনকোড করার জন্য একটি পিএইচপি লাইব্রেরির লিঙ্ক রয়েছে।

গুগল অ্যাপ ইঞ্জিনে তারা কীভাবে এবং কীভাবে এটি ব্যবহার করে তা ব্যাখ্যা করার জন্য এখানে আপনার একটি ভাল নিবন্ধ রয়েছে (পাইথন কোড তবে অনুসরণ করা সহজ)) জিএইতে জিওহ্যাশ ব্যবহারের প্রয়োজনীয়তার কারণে আপনি কয়েকটি ভাল পাইথন গ্রন্থাগার এবং উদাহরণ খুঁজে পেতে পারেন।

এই ব্লগ পোস্টটি যেমন ব্যাখ্যা করেছে, জিওহ্যাশগুলি ব্যবহার করার সুবিধাটি হ'ল আপনি সেই ক্ষেত্রে মাইএসকিউএল টেবিলের উপর একটি সূচক তৈরি করতে পারেন।


জিওহ্যাশের পরামর্শের জন্য ধন্যবাদ! আমি অবশ্যই এটি পরীক্ষা করে দেখব তবে এক ঘন্টার মধ্যে ওয়ার্ডক্যাম্প সাভানাহার উদ্দেশ্যে রওনা হচ্ছি এখনই পারছি না। এটি কোনও শহরে ভ্রমণকারী পর্যটকদের জন্য একটি রেস্তোরাঁর লোকেটার, সুতরাং 0.1 মাইল সম্ভবত নূন্যতম নির্ভুলতা হবে। আদর্শভাবে এটির চেয়ে ভাল হবে। আমি আপনার লিঙ্কগুলি সম্পাদনা করব!
মাইকচিন্কেল

আপনি যদি কোনও গুগল মানচিত্রে ফলাফলগুলি প্রদর্শন করতে যাচ্ছেন তবে আপনি তাদের এপিআই বাছাই কোডগুলি

যেহেতু এটি সবচেয়ে আকর্ষণীয় উত্তর তাই আমি এটি গ্রহণ করতে চলেছি যদিও আমার গবেষণা এবং চেষ্টা করার সময় নেই।
মাইকচিন্কেল

9

এটি আপনার জন্য খুব দেরিতে হতে পারে তবে আমি যেভাবেই এই সম্পর্কিত প্রশ্নটি দিয়েছিলাম তেমনই একটি উত্তর দিয়ে যাচ্ছি , যাতে ভবিষ্যতের দর্শকরা উভয় প্রশ্নের উল্লেখ করতে পারে refer

আমি এই মানগুলি পোস্ট মেটাডেটা টেবিলের মধ্যে সঞ্চয় করব না, বা কমপক্ষে কেবল সেখানেই না । আপনার সাথে একটি টেবিল চান post_id, lat, lonকলাম, যাতে আপনি একটি সূচক স্থাপন করতে পারেনlat, lon যে ও জিজ্ঞাস্য। পোস্ট সংরক্ষণ এবং আপডেটে একটি হুক দিয়ে আপ টু ডেট রাখার পক্ষে খুব বেশি শক্ত হওয়া উচিত নয়।

আপনি যখন ডাটাবেসটি জিজ্ঞাসা করেন, আপনি প্রারম্ভিক বিন্দুর চারপাশে একটি সীমাবদ্ধ বাক্সটি সংজ্ঞায়িত করেন , তাই আপনি বক্সেরlat, lon উত্তর-দক্ষিণ এবং পূর্ব-পশ্চিম সীমান্তের মধ্যে সমস্ত জুটির জন্য একটি দক্ষ কোয়েরি করতে পারেন ।

আপনি এই হ্রাস প্রাপ্ত ফলাফলটি পাওয়ার পরে, আপনি সীমানা বাক্সের কোণে অবস্থিত অবস্থানগুলি ফিল্টার করতে আরও বেশি উন্নত (বিজ্ঞপ্তিযুক্ত বা প্রকৃত ড্রাইভিং দিকনির্দেশ) দূরত্ব গণনা করতে পারেন এবং এরপরে নিজের ইচ্ছার চেয়ে আরও দূরে।

এখানে আপনি একটি সাধারণ কোড উদাহরণ খুঁজে পান যা প্রশাসনিক অঞ্চলে কাজ করে। আপনাকে অতিরিক্ত ডাটাবেস টেবিলটি নিজের তৈরি করতে হবে। কোডটি বেশিরভাগ থেকে অন্তত আকর্ষণীয় থেকে অর্ডার করা হয়।

<?php
/*
Plugin Name: Monkeyman geo test
Plugin URI: http://www.monkeyman.be
Description: Geolocation test
Version: 1.0
Author: Jan Fabry
*/

class Monkeyman_Geo
{
    public function __construct()
    {
        add_action('init', array(&$this, 'registerPostType'));
        add_action('save_post', array(&$this, 'saveLatLon'), 10, 2);

        add_action('admin_menu', array(&$this, 'addAdminPages'));
    }

    /**
     * On post save, save the metadata in our special table
     * (post_id INT, lat DECIMAL(10,5), lon DECIMAL (10,5))
     * Index on lat, lon
     */
    public function saveLatLon($post_id, $post)
    {
        if ($post->post_type != 'monkeyman_geo') {
            return;
        }
        $lat = floatval(get_post_meta($post_id, 'lat', true));
        $lon = floatval(get_post_meta($post_id, 'lon', true));

        global $wpdb;
        $result = $wpdb->replace(
            $wpdb->prefix . 'monkeyman_geo',
            array(
                'post_id' => $post_id,
                'lat' => $lat,
                'lon' => $lon,
            ),
            array('%s', '%F', '%F')
        );
    }

    public function addAdminPages()
    {
        add_management_page( 'Quick location generator', 'Quick generator', 'edit_posts', __FILE__  . 'generator', array($this, 'doGeneratorPage'));
        add_management_page( 'Location test', 'Location test', 'edit_posts', __FILE__ . 'test', array($this, 'doTestPage'));

    }

    /**
     * Simple test page with a location and a distance
     */
    public function doTestPage()
    {
        if (!array_key_exists('search', $_REQUEST)) {
            $default_lat = ini_get('date.default_latitude');
            $default_lon = ini_get('date.default_longitude');

            echo <<<EOF
<form action="" method="post">
    <p>Center latitude: <input size="10" name="center_lat" value="{$default_lat}"/>
        <br/>Center longitude: <input size="10" name="center_lon" value="{$default_lon}"/>
        <br/>Max distance (km): <input size="5" name="max_distance" value="100"/></p>
    <p><input type="submit" name="search" value="Search!"/></p>
</form>
EOF;
            return;
        }
        $center_lon = floatval($_REQUEST['center_lon']);
        $center_lat = floatval($_REQUEST['center_lat']);
        $max_distance = floatval($_REQUEST['max_distance']);

        var_dump(self::getPostsUntilDistanceKm($center_lon, $center_lat, $max_distance));
    }

    /**
     * Get all posts that are closer than the given distance to the given location
     */
    public static function getPostsUntilDistanceKm($center_lon, $center_lat, $max_distance)
    {
        list($north_lat, $east_lon, $south_lat, $west_lon) = self::getBoundingBox($center_lat, $center_lon, $max_distance);

        $geo_posts = self::getPostsInBoundingBox($north_lat, $east_lon, $south_lat, $west_lon);

        $close_posts = array();
        foreach ($geo_posts as $geo_post) {
            $post_lat = floatval($geo_post->lat);
            $post_lon = floatval($geo_post->lon);
            $post_distance = self::calculateDistanceKm($center_lat, $center_lon, $post_lat, $post_lon);
            if ($post_distance < $max_distance) {
                $close_posts[$geo_post->post_id] = $post_distance;
            }
        }
        return $close_posts;
    }

    /**
     * Select all posts ids in a given bounding box
     */
    public static function getPostsInBoundingBox($north_lat, $east_lon, $south_lat, $west_lon)
    {
        global $wpdb;
        $sql = $wpdb->prepare('SELECT post_id, lat, lon FROM ' . $wpdb->prefix . 'monkeyman_geo WHERE lat < %F AND lat > %F AND lon < %F AND lon > %F', array($north_lat, $south_lat, $west_lon, $east_lon));
        return $wpdb->get_results($sql, OBJECT_K);
    }

    /* Geographical calculations: distance and bounding box */

    /**
     * Calculate the distance between two coordinates
     * http://stackoverflow.com/questions/365826/calculate-distance-between-2-gps-coordinates/1416950#1416950
     */
    public static function calculateDistanceKm($a_lat, $a_lon, $b_lat, $b_lon)
    {
        $d_lon = deg2rad($b_lon - $a_lon);
        $d_lat = deg2rad($b_lat - $a_lat);
        $a = pow(sin($d_lat/2.0), 2) + cos(deg2rad($a_lat)) * cos(deg2rad($b_lat)) * pow(sin($d_lon/2.0), 2);
        $c = 2 * atan2(sqrt($a), sqrt(1-$a));
        $d = 6367 * $c;

        return $d;
    }

    /**
     * Create a box around a given point that extends a certain distance in each direction
     * http://www.colorado.edu/geography/gcraft/warmup/aquifer/html/distance.html
     *
     * @todo: Mind the gap at 180 degrees!
     */
    public static function getBoundingBox($center_lat, $center_lon, $distance_km)
    {
        $one_lat_deg_in_km = 111.321543; // Fixed
        $one_lon_deg_in_km = cos(deg2rad($center_lat)) * 111.321543; // Depends on latitude

        $north_lat = $center_lat + ($distance_km / $one_lat_deg_in_km);
        $south_lat = $center_lat - ($distance_km / $one_lat_deg_in_km);

        $east_lon = $center_lon - ($distance_km / $one_lon_deg_in_km);
        $west_lon = $center_lon + ($distance_km / $one_lon_deg_in_km);

        return array($north_lat, $east_lon, $south_lat, $west_lon);
    }

    /* Below this it's not interesting anymore */

    /**
     * Generate some test data
     */
    public function doGeneratorPage()
    {
        if (!array_key_exists('generate', $_REQUEST)) {
            $default_lat = ini_get('date.default_latitude');
            $default_lon = ini_get('date.default_longitude');

            echo <<<EOF
<form action="" method="post">
    <p>Number of posts: <input size="5" name="post_count" value="10"/></p>
    <p>Center latitude: <input size="10" name="center_lat" value="{$default_lat}"/>
        <br/>Center longitude: <input size="10" name="center_lon" value="{$default_lon}"/>
        <br/>Max distance (km): <input size="5" name="max_distance" value="100"/></p>
    <p><input type="submit" name="generate" value="Generate!"/></p>
</form>
EOF;
            return;
        }
        $post_count = intval($_REQUEST['post_count']);
        $center_lon = floatval($_REQUEST['center_lon']);
        $center_lat = floatval($_REQUEST['center_lat']);
        $max_distance = floatval($_REQUEST['max_distance']);

        list($north_lat, $east_lon, $south_lat, $west_lon) = self::getBoundingBox($center_lat, $center_lon, $max_distance);


        add_action('save_post', array(&$this, 'setPostLatLon'), 5);
        $precision = 100000;
        for ($p = 0; $p < $post_count; $p++) {
            self::$currentRandomLat = mt_rand($south_lat * $precision, $north_lat * $precision) / $precision;
            self::$currentRandomLon = mt_rand($west_lon * $precision, $east_lon * $precision) / $precision;

            $location = sprintf('(%F, %F)', self::$currentRandomLat, self::$currentRandomLon);

            $post_data = array(
                'post_status' => 'publish',
                'post_type' => 'monkeyman_geo',
                'post_content' => 'Point at ' . $location,
                'post_title' => 'Point at ' . $location,
            );

            var_dump(wp_insert_post($post_data));
        }
    }

    public static $currentRandomLat = null;
    public static $currentRandomLon = null;

    /**
     * Because I didn't know how to save meta data with wp_insert_post,
     * I do it here
     */
    public function setPostLatLon($post_id)
    {
        add_post_meta($post_id, 'lat', self::$currentRandomLat);
        add_post_meta($post_id, 'lon', self::$currentRandomLon);
    }

    /**
     * Register a simple post type for us
     */
    public function registerPostType()
    {
        register_post_type(
            'monkeyman_geo',
            array(
                'label' => 'Geo Location',
                'labels' => array(
                    'name' => 'Geo Locations',
                    'singular_name' => 'Geo Location',
                    'add_new' => 'Add new',
                    'add_new_item' => 'Add new location',
                    'edit_item' => 'Edit location',
                    'new_item' => 'New location',
                    'view_item' => 'View location',
                    'search_items' => 'Search locations',
                    'not_found' => 'No locations found',
                    'not_found_in_trash' => 'No locations found in trash',
                    'parent_item_colon' => null,
                ),
                'description' => 'Geographical locations',
                'public' => true,
                'exclude_from_search' => false,
                'publicly_queryable' => true,
                'show_ui' => true,
                'menu_position' => null,
                'menu_icon' => null,
                'capability_type' => 'post',
                'capabilities' => array(),
                'hierarchical' => false,
                'supports' => array(
                    'title',
                    'editor',
                    'custom-fields',
                ),
                'register_meta_box_cb' => null,
                'taxonomies' => array(),
                'permalink_epmask' => EP_PERMALINK,
                'rewrite' => array(
                    'slug' => 'locations',
                ),
                'query_var' => true,
                'can_export' => true,
                'show_in_nav_menus' => true,
            )
        );
    }
}

$monkeyman_Geo_instance = new Monkeyman_Geo();

@ জান : উত্তরের জন্য ধন্যবাদ। আপনি কি মনে করেন আপনি বাস্তবায়িত কিছু বাস্তব কোড সরবরাহ করতে পারেন?
মাইকচিন্কেল

@ মাইক: এটি একটি আকর্ষণীয় চ্যালেঞ্জ ছিল, তবে এখানে কিছু কোড দেওয়া উচিত যা কাজ করা উচিত।
জান ফ্যাব্রি

@ জন ফ্যাব্রি: দুর্দান্ত! আমি যখন এই প্রকল্পে ফিরে যাব তখন আমি এটি পরীক্ষা করে দেখব।
মাইকচিন্কেল

1

আমি এটির জন্য পার্টিতে দেরি করছি, তবে এ দিকে ফিরে তাকানো, get_post_metaআপনি যে এসকিউএল কোয়েরিটি ব্যবহার করছেন তার চেয়ে এখানে সমস্যাটিই সত্যিই এখানে।

সম্প্রতি আমি চালিত কোনও সাইটে আমাকে একই রকম ভূ-তাত্পর্যপূর্ণ করতে হয়েছিল এবং ল্যাট এবং লোন সংরক্ষণ করার জন্য মেটা টেবিলটি ব্যবহার না করে (যার জন্য সর্বাধিক দুটি সংযুক্ত হওয়া প্রয়োজন এবং যদি আপনি get_post_meta ব্যবহার করেন তবে দুটি অতিরিক্ত ডাটাবেস প্রতি স্থানে ক্যোয়ারী), আমি একটি স্থানিকভাবে সূচকযুক্ত জ্যামিতি POINT ডেটা টাইপ সহ একটি নতুন টেবিল তৈরি করেছি।

আমার জিজ্ঞাসাটি অনেকটা আপনার মত দেখাচ্ছে, মাইএসকিউএল প্রচুর ভারী উত্তোলনের সাথে (আমি ট্রিগ ফাংশনগুলি ছেড়ে দিয়ে সব কিছুকে দ্বি-মাত্রিক জায়গাতে সরল করে দিয়েছি, কারণ এটি আমার উদ্দেশ্যগুলির জন্য যথেষ্ট কাছে ছিল):

function nearby_property_listings( $number = 5 ) {
    global $client_location, $wpdb;

    //sanitize public inputs
    $lat = (float)$client_location['lat'];  
    $lon = (float)$client_location['lon']; 

    $sql = $wpdb->prepare( "SELECT *, ROUND( SQRT( ( ( ( Y(geolocation) - $lat) * 
                                                       ( Y(geolocation) - $lat) ) *
                                                         69.1 * 69.1) +
                                                  ( ( X(geolocation) - $lon ) * 
                                                       ( X(geolocation) - $lon ) * 
                                                         53 * 53 ) ) ) as distance
                            FROM {$wpdb->properties}
                            ORDER BY distance LIMIT %d", $number );

    return $wpdb->get_results( $sql );
}

যেখানে $ ক্লায়েন্ট_লোকেশন এমন একটি মান যা কোনও পাবলিক জিও আইপি লুকোয়িং পরিষেবা দিয়ে ফিরে আসে (আমি জিওও ডট কম ব্যবহার করেছি, তবে একই ধরণের অনেকগুলি রয়েছে are)

এটি অযৌক্তিক মনে হতে পারে তবে এটি পরীক্ষায় এটি ধারাবাহিকভাবে .4 সেকেন্ডের মধ্যে 80,000-সারি সারণির মধ্যে নিকটবর্তী 5 টি অবস্থান ফিরিয়ে দেয়।

মাইএসকিউএল DISTANCE ফাংশনটি প্রস্তাবিত না হওয়া পর্যন্ত এটি অবস্থান অনুসন্ধানগুলি কার্যকর করার মতো সেরা উপায় বলে মনে হচ্ছে।

সম্পাদনা: এই নির্দিষ্ট টেবিলের জন্য টেবিলের কাঠামো যুক্ত করা। এটি সম্পত্তির তালিকাগুলির একটি সেট, তাই এটি অন্য কোনও ব্যবহারের ক্ষেত্রে সাদৃশ্যপূর্ণ বা নাও হতে পারে।

CREATE TABLE IF NOT EXISTS `rh_properties` (
  `listingId` int(10) unsigned NOT NULL,
  `listingType` varchar(60) collate utf8_unicode_ci NOT NULL,
  `propertyType` varchar(60) collate utf8_unicode_ci NOT NULL,
  `status` varchar(20) collate utf8_unicode_ci NOT NULL,
  `street` varchar(64) collate utf8_unicode_ci NOT NULL,
  `city` varchar(24) collate utf8_unicode_ci NOT NULL,
  `state` varchar(5) collate utf8_unicode_ci NOT NULL,
  `zip` decimal(5,0) unsigned zerofill NOT NULL,
  `geolocation` point NOT NULL,
  `county` varchar(64) collate utf8_unicode_ci NOT NULL,
  `bedrooms` decimal(3,2) unsigned NOT NULL,
  `bathrooms` decimal(3,2) unsigned NOT NULL,
  `price` mediumint(8) unsigned NOT NULL,
  `image_url` varchar(255) collate utf8_unicode_ci NOT NULL,
  `description` mediumtext collate utf8_unicode_ci NOT NULL,
  `link` varchar(255) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`listingId`),
  KEY `geolocation` (`geolocation`(25))
)

geolocationকলাম উদ্দেশ্যে এখানে প্রাসঙ্গিক একমাত্র জিনিস নয়; এটিতে x (দীর্ঘ), y (ল্যাট) স্থানাঙ্ক থাকে যে আমি কেবলমাত্র ডাটাবেসে নতুন মান আমদানি করার সময় ঠিকানা থেকে সন্ধান করি।


ফলোআপের জন্য ধন্যবাদ। আমি সত্যিই কোনও টেবিল যুক্ত এড়ানোর চেষ্টা করেছি তবে নির্দিষ্ট ব্যবহারের ক্ষেত্রে এটি আরও জেনেরিক করার চেষ্টা করার পরেও একটি টেবিল যুক্ত করা শেষ করেছি। তবুও, আমি পয়েন্ট তথ্য প্রকারটি ব্যবহার করিনি কারণ আমি স্ট্যান্ডার্ড ডেটা প্রকারগুলি আরও ভালভাবে জানাতে চেয়েছি; মাইএসকিউএলের জিও এক্সটেনশনের জন্য স্বাচ্ছন্দ্য বোধ করার জন্য খুব ভাল শিখতে হবে। এটি বলেছিল, আপনি যে টেবিলটি ব্যবহার করেছেন তা দয়া করে আপনার উত্তরটি আপডেট করতে পারবেন? আমি মনে করি ভবিষ্যতে এটি পড়া অন্যদের জন্য শিক্ষামূলক হবে।
মাইকস্কিঙ্কেল

0

সমস্ত সত্তার মধ্যে কেবল দূরত্বগুলি প্রাক-গণনা করুন। আমি মূল্যবোধের সূচী করার ক্ষমতা সহ এটি একটি নিজস্ব ডাটাবেস টেবিলের মধ্যে সংরক্ষণ করব।


এটি কার্যত অসীম রেকর্ডের সংখ্যা ...
মাইকচিনকেল

Infinte? আমি এখানে কেবল n ^ 2 দেখতে পাচ্ছি, এটি প্রবেশ করবে না। বিশেষত আরও বেশি সংখ্যক এন্ট্রি সহ, প্রাক্ক্যালক্টিয়নটি আরও বেশি করে বিবেচনা করা উচিত।
hakre

কার্যত অসীম। ল্যাট / লংকে dec দশমিক স্থানের নির্ভুলতায় দেওয়া হয়েছে যা 6.41977E + 17 রেকর্ড দেবে। হ্যাঁ আমাদের কাছে এতগুলি নেই তবে আমাদের কাছে যুক্তিসঙ্গত যা কিছু আছে তার চেয়ে অনেক বেশি আছে।
মাইকচিন্কেল

অসীম একটি ভাল সংজ্ঞাযুক্ত শব্দ, এবং এতে বিশেষণ যুক্ত করা খুব বেশি পরিবর্তন হয় না। তবে আমি জানি আপনি কী বোঝেন, আপনি এটি গণনা করার জন্য খুব বেশি বলে মনে করেন। যদি আপনি সময়ের সাথে সাবলীলভাবে প্রচুর পরিমাণে নতুন স্থান যুক্ত না করে থাকেন তবে ব্যাকগ্রাউন্ডে আপনার অ্যাপ্লিকেশনকে বাদ দিয়ে একটি কাজ ধাপে ধাপে এই প্রাক-গণনা করা যেতে পারে। নির্ভুলতা গণনার সংখ্যা পরিবর্তন করে না। লোকেশন সংখ্যা। তবে আমি আপনার মন্তব্যের সেই অংশটি ভুলভাবে লিখতে পারি। উদাহরণস্বরূপ 64৪ টি অবস্থানের ফলাফল 4 096 (অথবা 4 * 032 এন * (এন -1) এর জন্য গণনা এবং অতএব রেকর্ডে নেবে।
hakre
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.